this關鍵字的定義
this是Javascript語言的一個關鍵字。
普通定義:當前發生事件的對象。
通俗定義:當前的方法屬於誰。
全局作用域中的this
console.log(this); // Window全局對象
在瀏覽器中執行,將會得到一個全局的Window對象。
在瀏覽器中執行,將會得到一個全局的Window對象。
1、純粹的函數直接調用
var x = 1;function test(){ this.x = 0;}test();alert(x); //0
this作爲全局對象Global調用,屬於全局通用性。
2、作爲對象的方法調用
function test(){ alert(this.x);}var o = {}; //聲明一個對象o.x = 1; //給對象添加一個屬性o.m = test; //給對象添加一個方法o.m(); // 1 調用方法,結果爲1
當函數作爲對象的方法被調用時,this指向當前調用該方法的對象。
3、作爲構造函數調用
var x = 2;function test(){ this.x = 1;}var o = new test();alert(o.x); //1alert(x); //2
全局對象中的屬性x並沒有被改變,此時this指向該構造函數創建的對象。
4、apply、call、bind調用
var x = 0;function test(){ alert(this.x);}var o = {}; //聲明一個對象o.x = 1; //給對象添加一個屬性o.m = test; //給對象添加一個方法o.m.apply(); //0o.m.apply(o); //1o.m.call(); //0o.m.call(o); //1
call和apply都是Function對象的方法,都可以用來動態改變this的指向,達成函數複用的目的。
兩個方法的第一個參數就是this,不傳參數默認爲全局對象,傳入參數表示當前傳入的對象。
注意:兩種調用方式產生的結果完全相同。如果你已經有一個數組,使用apply方法,只有一個單獨的變量,則用call方法。
嵌套函數作用域中的this
var a = 1;function test(){ console.log(this.a); // 2 var self = this; function test2(){ console.log(self.a); // 2 } test2();}var o = {}; //聲明一個對象o.a = 2; //給對象添加一個屬性o.m = test; //給對象添加一個方法o.m();
嵌套函數中,爲了防止this作用域的混亂使用,通常自定義一個變量用於存儲this,然後在嵌套函數內部使用這個變量,如代碼中的self。