1.this的作用
function identify() {
return this.name.toUpperCase();
}
function sayHello() {
var greeting = "Hello, I'm " + identify.call( this );
console.log( greeting );
}
var person1= {
name: "Kyle"
};
var person2= {
name: "Reader"
};
identify.call( person1); // KYLE
identify.call( person2); // READER
sayHello.call( person1); // Hello, I'm KYLE
sayHello.call( person2); // Hello, I'm READER
用來(lái)綁定對(duì)象,進(jìn)行屬性和方法的操作。
順便說(shuō)一句:
JS中不在乎你寫成什么,而在于你把它看成什么。
個(gè)人認(rèn)為:萬(wàn)物皆為對(duì)象恨憎。對(duì)象內(nèi)部存在屬性和方法。
2.只有4種方式改變this指向
2.1 默認(rèn)綁定全局變量
這條規(guī)則是最常見(jiàn)的,也是默認(rèn)的塘幅。當(dāng)函數(shù)被單獨(dú)定義和調(diào)用的時(shí)候,應(yīng)用的規(guī)則就是綁定全局變量尿贫。如下:
function fn() {
console.log( this.a );
}
var a = 2;
fn(); // 2 -- fn單獨(dú)調(diào)用电媳,this引用window
2.2 隱式綁定
隱式調(diào)用的意思是,函數(shù)調(diào)用時(shí)擁有一個(gè)上下文對(duì)象庆亡,就好像這個(gè)函數(shù)是屬于該對(duì)象的一樣匾乓。
這里需要了解,函數(shù)內(nèi)部的this指向調(diào)用該函數(shù)的對(duì)象又谋。
例如:
function fn() {
console.log( this.a );
}
var obj = {
a: 2,
fn: fn
};
obj.fn(); // 2 -- this引用obj拼缝。
需要說(shuō)明的一點(diǎn)是娱局,最后一個(gè)調(diào)用該函數(shù)的對(duì)象是傳到函數(shù)的上下文對(duì)象
function fn() {
console.log( this.a );
}
var obj2 = {
a: 42,
fn: fn
};
var obj1 = {
a: 2,
obj2: obj2
};
obj1.obj2.fn(); // 42 -- this引用的是obj2.
還有一點(diǎn)要說(shuō)明的是,失去隱式綁定的情況咧七,如下:
function fn() {
console.log( this.a );
}
var obj = {
a: 2,
fn: fn
};
var bar = obj.fn; // 函數(shù)引用傳遞
var a = "全局"; // 定義全局變量
bar(); // "全局"
如上衰齐,第8行雖然有隱式綁定,但是它執(zhí)行的效果明顯是把fn賦給bar继阻。這樣bar執(zhí)行的時(shí)候耻涛,依然是默認(rèn)綁定全局變量,所以輸出結(jié)果如上瘟檩。
2.3 顯示綁定
學(xué)過(guò)bind()\apply()\call()函數(shù)的都應(yīng)該知道抹缕,它接收的第一個(gè)參數(shù)即是上下文對(duì)象并將其賦給this∶⑴粒看下面的例子:
function fn() {
console.log( this.a );
}
var obj = {
a: 2
};
fn.call( obj ); // 2
如果我們傳遞第一個(gè)值為簡(jiǎn)單值歉嗓,那么后臺(tái)會(huì)自動(dòng)轉(zhuǎn)換為對(duì)應(yīng)的封裝對(duì)象。如果傳遞為null背蟆,那么結(jié)果就是在綁定默認(rèn)全局變量鉴分,如:
function fn() {
console.log( this.a );
}
var obj = {
a: 2
};
var a = 10;
fn.call( null); // 10
其中call和apply作用相同,但是apply后面接偽數(shù)組[1,2,3]带膀,call后面接正規(guī)參數(shù)(a,b,c)或者數(shù)組[1,2,3]志珍。
而bind在ES5中提出,用來(lái)解決apply和call沒(méi)有解決的問(wèn)題垛叨。將方法執(zhí)行和this綁定分開伦糯。
2.4 new新對(duì)象綁定
如果是一個(gè)構(gòu)造函數(shù),那么用new來(lái)調(diào)用嗽元,那么綁定的將是新創(chuàng)建的對(duì)象敛纲。如:
function fn(a) {
this.a = a;
}
var bar = new fn( 2 );
console.log( bar.a );// 2
其實(shí)第四條和第三條是同樣的。new的過(guò)程中剂癌,自動(dòng)發(fā)生了call方法淤翔,進(jìn)行了this的綁定。