在函數(shù)執(zhí)行的時(shí)候,this總是指向調(diào)用該函數(shù)的對(duì)象懊渡。
要判斷this的指向刽射,其實(shí)就是判斷this所在的函數(shù)屬于誰。
在《JavaScript語(yǔ)言精粹》這本書中距贷,把this出現(xiàn)的場(chǎng)景分為4類柄冲,簡(jiǎn)單說就是:
1. 有對(duì)象 就指向調(diào)用對(duì)象
var myObject = {value:100};
myObject.getValue = function(){
console.log(this.value);//輸出100
console.log(this);//輸出 { value: 100, getValue: [Function] }
}
myObject.getValue();
// getValue() 屬于對(duì)象 myObject,并由 myOjbect 進(jìn)行 . 調(diào)用忠蝗,因此 this 指向?qū)ο?myObject现横。
2.沒調(diào)用對(duì)象就指向全局對(duì)象
var myObject = { value: 100 };
myObject.getValue = function() {
var foo = function() {
console.log(this.value) // 輸出 undefined
console.log(this); // 輸出全局對(duì)象 global
//foo 函數(shù)雖然定義在 getValue 的函數(shù)體內(nèi),但實(shí)際上它既不屬于 getValue 也不屬于 myObject。
// foo 并沒有被綁定在任何對(duì)象上戒祠,所以當(dāng)調(diào)用時(shí)骇两,它的 this 指針指向了全局對(duì)象 global。
};
foo();
return this.value; //這個(gè)this 在 getValue中姜盈,從而指向 myObject低千。
};
console.log(myObject.getValue()); // 輸出 100
- 用new構(gòu)造就指向新對(duì)象
//js 中,我們通過 new 關(guān)鍵詞來調(diào)用構(gòu)造函數(shù)馏颂,此時(shí) this 會(huì)綁定在該新對(duì)象上示血。
var SomeClass = function() {
this.value = 100;
}
var myCreate = new SomeClass();
console.log(myCreate.value); // 輸出10
- 通過 apply 或 call 或 bind 來改變 this 的所指
// apply 和 call 調(diào)用以及 bind 綁定: 指向綁定的對(duì)象
// apply() 方法接受兩個(gè)參數(shù)第一個(gè)是函數(shù)運(yùn)行的作用域, 另外一個(gè)是一個(gè)參數(shù)數(shù)組(arguments)救拉。
// call() 方法第一個(gè)參數(shù)的意義與 apply() 方法相同难审, 只是其他的參數(shù)需要一個(gè)個(gè)列舉出來。
// 簡(jiǎn)單來說亿絮, call 的方式更接近我們平時(shí)調(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>