JavaScript的this和Java等面向對象語言中的this大不一樣,bind()、call()和apply()函數(shù)更是將this的靈活度進一步延伸。
為了保證可讀性,本文采用意譯而非直譯。另外,本文版權歸原作者所有,翻譯僅用于學習。
如果對JavaScript的關鍵字this理解不夠深刻,有時候會掉入意想不到的坑。在這里我們總結了5條通用規(guī)則來幫助你判斷this到底指向什么。雖然沒有囊括所有的情況,但日常大部分情況都可以使用這些規(guī)則來正確推斷。
this的值通常是由所在函數(shù)的執(zhí)行環(huán)境決定,也就是說要看函數(shù)是如何被調用的;
同一個函數(shù)每一次調用,this都可能指向不同的對象;
全局對象 (Global Object)
打開Chrome瀏覽器開發(fā)者面板(Windows: Ctrl + Shift + J)(Mac: Cmd + Option + J),并且輸入:
console.log(this);
看看輸出了什么?
// Window {}window對象! 因為在全局作用域下,this指向全局對象。在瀏覽器中全局對象就是window對象。
為了讓你更加清楚理解為什么this會指向window對象,我們來看另外一個例子:
var myName = 'Brandon';
我們可以通過在控制臺輸入myName來訪問其值:
myName// 輸出 'Brandon'
其實,所有在全局定義的變量都綁定到window對象。我們來做如下測試:
window.myName// 輸出 'Brandon'window.myName === myName// 輸出 true
現(xiàn)在我們將this放到函數(shù)內部,看看有何效果。
function test(){ return this;}test();你會發(fā)現(xiàn)this依然指向全局的window對象。因為this關鍵字沒有處于一個聲明的對象內部,默認指向全局window對象。這一點可能對于大部分初學者來說有點難以理解。當讀完這篇文章,你就會豁然開朗。
注意:如果在strcit模式下,上面的例子中this為undefined。
聲明的對象 (Declared Object)
當this關鍵字在一個聲明對象內部使用,其值會被綁定到調用該this的函數(shù)的最近的父對象。我們用例子來說明這個問題:
var person = { first: 'John', last: 'Smith', full: function() { console.log(this.first + ' ' + this.last); }};person.full();// 輸出 'John Smith'在被聲明的對象person中的full函數(shù)里面使用了this, 那么調用this的full函數(shù)的最近的父對象就是person, 因此,this指向person。
為了更好的描述this實際上是指向person對象的,你可以拷貝如下代碼到瀏覽器控制臺,將this打印出來。
var person = { first: 'John', last: 'Smith', full: function() { console.log(this); }};person.full();// 輸出 Object {first: "John", last: "Smith", full: function}我們接下來看一個更復雜的例子:
新聞熱點
疑難解答
圖片精選