在函數(shù)執(zhí)行的時候,this總是指向調(diào)用該函數(shù)的對象。
要判斷this的指向,其實就是判斷this所在的函數(shù)屬于誰。
在《JavaScript語言精粹》這本書中,把this出現(xiàn)的場景分為4類,簡單說就是:
1. 有對象 就指向調(diào)用對象
var myObject = {value:100};
myObject.getValue = function(){
console.log(this.value);//輸出100
console.log(this);//輸出 { value: 100, getValue: [Function] }
}
myObject.getValue();
// getValue() 屬于對象 myObject,并由 myOjbect 進(jìn)行 . 調(diào)用,因此 this 指向?qū)ο?myObject。
2.沒調(diào)用對象就指向全局對象
var myObject = { value: 100 };
myObject.getValue = function() {
var foo = function() {
console.log(this.value) // 輸出 undefined
console.log(this); // 輸出全局對象 global
//foo 函數(shù)雖然定義在 getValue 的函數(shù)體內(nèi),但實際上它既不屬于 getValue 也不屬于 myObject。
// foo 并沒有被綁定在任何對象上,所以當(dāng)調(diào)用時,它的 this 指針指向了全局對象 global。
};
foo();
return this.value; //這個this 在 getValue中,從而指向 myObject。
};
console.log(myObject.getValue()); // 輸出 100
- 用new構(gòu)造就指向新對象
//js 中,我們通過 new 關(guān)鍵詞來調(diào)用構(gòu)造函數(shù),此時 this 會綁定在該新對象上。
var SomeClass = function() {
this.value = 100;
}
var myCreate = new SomeClass();
console.log(myCreate.value); // 輸出10
- 通過 apply 或 call 或 bind 來改變 this 的所指
// apply 和 call 調(diào)用以及 bind 綁定: 指向綁定的對象
// apply() 方法接受兩個參數(shù)第一個是函數(shù)運行的作用域, 另外一個是一個參數(shù)數(shù)組(arguments)。
// call() 方法第一個參數(shù)的意義與 apply() 方法相同, 只是其他的參數(shù)需要一個個列舉出來。
// 簡單來說, call 的方式更接近我們平時調(diào)用函數(shù), 而 apply 需要我們傳遞 Array 形式的數(shù)組給它。 它們是可以互相轉(zhuǎn)換的。
//apply和call的功能是一樣的,只是傳入的參數(shù)列表形式不同。
//var a1 = add.apply(sub,[4,2]); //sub調(diào)用add的方法
/*call的用法*/
//var a1 = add.call(sub,4,2);
var myObject = { value: 100 };
var foo = function() {
console.log(this);
};
foo(); // 全局變量 global
foo.apply(myObject); // { value: 100 }
foo.call(myObject); // { value: 100 }
var newFoo = foo.bind(myObject);
newFoo(); // { value: 100 }</span>