JavaScript的this,你真的懂了嗎

this關鍵字的定義數組

普通定義:當前發生事件的對象。瀏覽器

通俗定義:當前的方法屬於誰。app

全局做用域中的this

console.log(this); // Window全局對象

在瀏覽器中執行,將會獲得一個全局的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

四、apply、call、bind調用

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方法。作用域

嵌套函數做用域中的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。

相關文章
相關標籤/搜索