真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

關(guān)于js中的This指向的相關(guān)介紹

本篇文章和大家了解一下關(guān)于js中的This指向的相關(guān)介紹。有一定的參考價值,有需要的朋友可以參考一下,希望對大家有所幫助。

創(chuàng)新互聯(lián)網(wǎng)站建設(shè)公司一直秉承“誠信做人,踏實(shí)做事”的原則,不欺瞞客戶,是我們最起碼的底線! 以服務(wù)為基礎(chǔ),以質(zhì)量求生存,以技術(shù)求發(fā)展,成交一個客戶多一個朋友!專注中小微企業(yè)官網(wǎng)定制,成都網(wǎng)站設(shè)計(jì)、做網(wǎng)站,塑造企業(yè)網(wǎng)絡(luò)形象打造互聯(lián)網(wǎng)企業(yè)效應(yīng)。

關(guān)于js中的This指向的相關(guān)介紹

1、基本概念

MDN的官方解釋:與其他語言相比,函數(shù)的 this 關(guān)鍵字在 JavaScript 中的表現(xiàn)略有不同,此外,在嚴(yán)格模式和非嚴(yán)格模式之間也會有一些差別。在絕大多數(shù)情況下,函數(shù)的調(diào)用方式?jīng)Q定了this的值。this不能在執(zhí)行期間被賦值,并且在每次函數(shù)被調(diào)用時this的值也可能會不同。

簡而言之:

1.this指向的對象稱為函數(shù)的上下文對象context;

2.this的指向取決于函數(shù)被調(diào)用方式

不管函數(shù)怎么調(diào)用的天花亂墜,我們只要記住這幾點(diǎn)即可清晰的找出this的指向。

2、小實(shí)驗(yàn)

function foo(){
 console.log(this);
}

面試官問你this指向哪里,當(dāng)然大聲回答不知道,原因:誰調(diào)用指向誰,函數(shù)都沒被調(diào)用,確實(shí)不知道指向。

關(guān)于js中的This指向的相關(guān)介紹

小結(jié):直接通過函數(shù)名來調(diào)用函數(shù),this指向全局變量window;通過對象.函數(shù)名調(diào)用函數(shù),this指向該對象。

3、DOM對象調(diào)用函數(shù)時this的指向問題

1.通過選擇器選擇元素加事件屬性來綁定事件,this指向該DOM對象,例子如下:

document.getElementById('btn').onclick=function(){
  console.log('click'); //click
  console.log(this); //
 }

2.直接在DOM標(biāo)簽中寫事件,this指向window,我們可以通過吧this作為參數(shù)傳入方法中再使用,例子如下:

html:

0


script:
// 操作方法
 function modify(){
  console.log(this); //window
 }

因?yàn)檫@個時候是直接調(diào)用方法的,所以this指向全局window對象,那么問題來了,我們想判斷我們點(diǎn)擊的是哪一個按鈕,應(yīng)該怎么做呢,我們可以把this的值作為參數(shù)傳入方法中再使用,例子如下。

html:

0


script:
// 操作方法
 function modify(_this){
  console.log(_this); 
// 
// 
 }

4.對象中this的指向問題

先看一個簡單的例子:

var a=1;
function printA(){
 console.log(this.a);
}
var obj={
 a:2,
 foo:printA,
 bar:function(){
  printA();
 }
}
obj.foo(); //2
obj.bar(); //1var foo=obj.foo;foo(); //1

我們定義了一個全局變量a和一個打印a的全局變量方法,之后又定義了一個obj對象,其中包含a屬性和foo,bar兩個方法。當(dāng)我們調(diào)用obj.foo()打印了2,調(diào)用obj.bar()打印了1.

分析:

不管printA在哪里定義的,我們this的指向只取決于被誰調(diào)用的。在obj.foo(),foo的屬性值為printA,被obj直接調(diào)用,所以this指向obj,this.a就是obj.a=2了;

當(dāng)我們調(diào)用obj.bar()時,bar的屬性值為function(){printA()},沒有明確哪個對象來調(diào)用printA方法,this默認(rèn)指向全局對象window,所以this.a=window.a=1;

第三種情況我們把obj.foo值賦予了foo變量,在調(diào)用的時候就相當(dāng)于是window.foo()了,打印1。

小結(jié):this的指向不是函數(shù)聲明是綁定的,而是在函數(shù)運(yùn)行過程中動態(tài)綁定的。

5.改變this的指向方法:applay call bind

話不多話:寫了一個例子,大家先看,萬一比喻不恰當(dāng),大家能理解其中意思即可

var liLei={
 name:'liLei',
 money:10,
 buyPen:function(){
  this.money=this.money-1;
  console.log(this.name+" have money:"+this.money)
 }
}

var hanMeiMei={
 name:'hanMeiMei',
 money:20,
 buyPan:function(){
  this.money=this.money-2;
  console.log(this.name+" have money:"+this.money)
 }
}

liLei.buyPen(); // liLei have money:9
hanMeiMei.buyPan(); //hanMeiMei have money:18

例子很好理解,輸出的結(jié)果相信大家也能看得明白,哪天,韓梅梅想買一個盆,她買不了,因?yàn)樗€沒有這個方法,她一想:我沒有這個方法,但是李雷有啊,我打電話給李雷把錢他讓他幫我買啊;后來李雷想買一個盤,實(shí)現(xiàn)方法也是如此。那么,在代碼中如何實(shí)現(xiàn)呢?

JavaScript有好幾個方法可以實(shí)現(xiàn):call,apply,bind。

call方法:

語法:call(thisObj,Object)

定義:調(diào)用一個對象的一個方法,以另一個對象替換當(dāng)前對象。

說明:

call 方法可以用來代替另一個對象調(diào)用一個方法。call 方法可將一個函數(shù)的對象上下文從初始的上下文改變?yōu)橛?thisObj 指定的新對象。如果沒有提供 thisObj 參數(shù),那么 Global 對象被用作 thisObj。

liLei.buyPen.call(hanMeiMei); //hanMeiMei have money:19
hanMeiMei.buyPan.call(liLei); //liLei have money:8

apply方法:

語法:apply(thisObj,[argArray])

定義:應(yīng)用某一對象的一個方法,用另一個對象替換當(dāng)前對象。

說明:

如果 argArray 不是一個有效的數(shù)組或者不是 arguments 對象,那么將導(dǎo)致一個 TypeError。如果沒有提供 argArray 和 thisObj 任何一個參數(shù),那么 Global 對象將被用作 thisObj, 并且無法被傳遞任何參數(shù)。

liLei.buyPen.apply(hanMeiMei); //hanMeiMei have money:19
hanMeiMei.buyPan.apply(liLei); //liLei have money:8

bind方法:

liLei.buyPen.bind(hanMeiMei)(); //hanMeiMei have money:19
hanMeiMei.buyPan.apply(liLei)(); //liLei have money:8

小結(jié):三種方法的相同指出是:可以改變this的指向,不同之處是:apply接受的參數(shù)為一個數(shù)組,call接收的參數(shù)為一個個獨(dú)立的值;apply,call會直接調(diào)用方法,bind改變this的指向返回一個方法不調(diào)用。

以上就是關(guān)于js中的This指向的簡略介紹,當(dāng)然詳細(xì)使用上面的不同還得要大家自己使用過才領(lǐng)會。如果想了解更多,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道哦


本文名稱:關(guān)于js中的This指向的相關(guān)介紹
分享路徑:http://weahome.cn/article/jsseej.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部