2010-05-02 39 views
5

我問了一個關於「this」指向Window對象的問題Javascript this points to Window objectjavascript「this」再次指向Window對象

這裏是源代碼

var archive = function(){} 

archive.prototype.action = { 
    test: function(callback){ 
     callback(); 
    }, 
    test2: function(){ 
     console.log(this); 
    } 
} 

var oArchive = new archive(); 
oArchive.action.test(oArchive.action.test2); 

添向下寫「但那個功能,然後使用回調()調用,這意味着它不叫作爲方法因此這是全局對象」。

通過實際名稱調用函數和源代碼中顯示的callback()之間有什麼區別?

當test2中的console.log(this)指向Window時,它在archive.action中?

回答

10

在JavaScript中,你可以調用使用4個不同的調用圖形的功能:

  • 函數調用
  • 方法調用
  • 應用/呼叫調用
  • 建設調用

式樣主要this參數的初始化方式不同。

當使用oArchive.action.test2(),你將被調用test2()功能與方法模式,並且在這種情況下,將this綁定到action對象。只要調用表達式包含細化(即.點表達式或[subscript]表達式),JavaScript就會使用方法模式。另一方面,當函數不是對象的屬性時,則使用函數模式調用函數。在這種情況下,this參數綁定到全局對象,實際上這就是JavaScript如何調用您的callback()函數。

Douglas Crockford在他的Good Parts book中,將此描述爲語言設計中的錯誤,並提出了一些可能的解決方法。在你的情況下,一個簡單的解決方法是調用使用call()apply()回調,爲Tim Down suggested in your previous question

callback.call(this); 

這工作,因爲該應用/呼叫調用模式讓你選擇的this的價值,這是你需要什麼。

+0

我想你也可以在調用oArchive.action.test時使用oArchive.action.test2.bind(oArchive.action.test) – 2015-04-30 11:22:24

3

在javascript中,this關鍵字被設置爲函數的所有者。函數對象本身並不保留它們的所有權,而是從我們稱之爲函數的方式推導出所有權。

如:

var foo = function() { 
    alert('hello'); 
}; 
var abc = {}; 
abc.bar = foo; 

簡單地調用函數一樣

foo(); 

給出瞭解釋沒有什麼反對的功能可能被附加到線索。它可以附加到多個對象,它可能是一個變量等。因此解釋器將this設置爲全局對象。

但然而,調用一個函數像

abc.bar(); 

當解釋器知道函數被附接到abc對象,因此this設置爲abc。即使barfoo都引用相同的函數對象,調用模式的差異也會導致this的行爲不同。

相關問題