this引用的是函數(shù)據(jù)以執(zhí)行的環(huán)境對(duì)象郭宝。雖然函數(shù)的作用域是在聲明時(shí)決定的涡贱,但是this實(shí)際上是在函數(shù)被調(diào)用時(shí)發(fā)生的綁定钓葫,它指向什么完全取決于函數(shù)在哪里被調(diào)用,所以this的指向是可變的嵌灰。
this是函數(shù)的內(nèi)部屬性弄匕,所以this的使用環(huán)境是在函數(shù)中。
this的指向是一個(gè)對(duì)象沽瞭。
this綁定規(guī)則
判斷函數(shù)中this綁定的對(duì)象規(guī)則:
- 函數(shù)是否在new中調(diào)用(new 綁定)迁匠?如果是的話this綁定的是新創(chuàng)建的對(duì)象;
- 函數(shù)是否通過(guò)call驹溃、apply(顯式綁定)或者硬綁定調(diào)用城丧? 如果是的話,this綁定的是指定的對(duì)象豌鹤;
- 函數(shù)是否在某個(gè)上下文對(duì)象中調(diào)用(也就是函數(shù)作為某個(gè)對(duì)象的方法調(diào)用)(隱式綁定)亡哄?如果是的話,this綁定的是那個(gè)上下文對(duì)象布疙;
- 如果都不是的話蚊惯, 使用默認(rèn)綁定。如果在嚴(yán)格模式下灵临,就綁定到undefined截型,否則綁定到全局對(duì)象;
從上至下逐條判斷儒溉,就能正確判斷this的指向宦焦。
-
new 綁定,構(gòu)造函數(shù)生成實(shí)例中調(diào)用顿涣;
function F() {
this.a = 1;
this.sayA = function () {
console.log(this.a);
}
}
var f = new F();
f.sayA(); // 1 -
call波闹、apply調(diào)用(顯式綁定);
-
call园骆、apply接收兩個(gè)參數(shù)舔痪,第一個(gè)是參數(shù)是對(duì)象寓调,函數(shù)this就會(huì)指向這個(gè)對(duì)象锌唾,如果你傳入了一個(gè)原始值(字符串類型、布爾類型或者數(shù)字類型)來(lái)當(dāng)作 this 的綁定對(duì)象夺英,這個(gè)原始值會(huì)被轉(zhuǎn)換成它的對(duì)象形式(也就是 new String(..)晌涕、new Boolean(..)或者new Number(..));第二個(gè)參數(shù)是函數(shù)調(diào)用的痛悯;
var a = 1; var obj = { a: 2 }; function f() { console.log(this.a); } f(); // 1 f.call(obj); // 2余黎,硬性將f的this綁定到指定對(duì)象 f.apply(obj); // 2
-
bind,bind的作用與call载萌、apply一樣惧财,都是為函數(shù)指定執(zhí)行環(huán)境對(duì)象巡扇,但是bind返回的是一個(gè)新函數(shù),而call和apply會(huì)直接執(zhí)行返回結(jié)果垮衷;
var a = 1; var obj = { a: 2 }; function f() { console.log(this.a); } f(); // 1 var f2 = f.bind(obj); // 返回的是一個(gè)新函數(shù)厅翔,所以可以將函數(shù)保存至變量,方便以后調(diào)用 f2(); // 2
如果你把null或者undefined作為 this 的綁定對(duì)象傳入call搀突、apply或者bind刀闷,這些值在調(diào)用時(shí)會(huì)被忽略,實(shí)際應(yīng)用的是默認(rèn)綁定規(guī)則仰迁;
-
-
作為對(duì)象方法調(diào)用(隱式綁定)甸昏;
var a = 1; function f() { console.log(this.a); } var obj = { a: 2, f: f // 將對(duì)象的方法指向函數(shù) }; obj.f(); // 2,當(dāng)函數(shù)作為對(duì)象方法時(shí)徐许,this就指向當(dāng)前對(duì)象 var f2 = obj.f; f2(); //1施蜜,相當(dāng)于直接調(diào)用f,所以this指向全局對(duì)象 var obj2 = { a: 3, f: obj.f }; obj2.f(); // 3雌隅,作為對(duì)象方法調(diào)用
-
默認(rèn)函數(shù)調(diào)用花墩,函數(shù)獨(dú)立調(diào)用;
var a = 1; // 全局變量會(huì)成為全局對(duì)象的屬性澄步,所以當(dāng)this指向全局對(duì)象時(shí)能夠訪問(wèn) function f() { console.log(this.a); } f(); // 1冰蘑,普通的函數(shù)調(diào)用,this指向全局對(duì)象