this關鍵字的定義數組
普通定義:當前發生事件的對象。瀏覽器
通俗定義:當前的方法屬於誰。app
console.log(this); // Window全局對象
在瀏覽器中執行,將會獲得一個全局的Window對象。函數
var x = 1; function test(){ this.x = 0; } test(); alert(x); //0
this做爲全局對象Global調用,屬於全局通用性。this
function test(){ alert(this.x); } var o = {}; //聲明一個對象 o.x = 1; //給對象添加一個屬性 o.m = test; //給對象添加一個方法 o.m(); // 1 調用方法,結果爲1
當函數做爲對象的方法被調用時,this指向當前調用該方法的對象。spa
var x = 2; function test(){ this.x = 1; } var o = new test(); alert(o.x); //1 alert(x); //2
全局對象中的屬性x並無被改變,此時this指向該構造函數建立的對象。code
var x = 0; function test(){ alert(this.x); } var o = {}; //聲明一個對象 o.x = 1; //給對象添加一個屬性 o.m = test; //給對象添加一個方法 o.m.apply(); //0 o.m.apply(o); //1 o.m.call(); //0 o.m.call(o); //1
call和apply都是Function對象的方法,均可以用來動態改變this的指向,達成函數複用的目的。對象
兩個方法的第一個參數就是this,不傳參數默認爲全局對象,傳入參數表示當前傳入的對象。事件
注意:兩種調用方式產生的結果徹底相同。若是你已經有一個數組,使用apply方法,只有一個單獨的變量,則用call方法。作用域
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。