2012-02-01 67 views
3

在這個片段請看:的Javascript:obj.fn()與X = obj.fn; X()

var obj = { 
    fn: function() {return this;} 
}; 
var x = obj.fn;  

obj.fn(); // returns obj 
x(); // returns window (in the browser) 

我很好奇,爲什麼obj.fn()x=obj.fn; x()不同。在單個表達式中是否有特殊情況下的屬性查找直接跟隨函數調用 - 或者有一些更復雜的魔法發生在引擎蓋下(如Python中的descriptor protocol)?

回答

6

來自this上下文變量的值總是取決於函數的調用方式。

obj.fn(); 

將調用功能method,這意味着它的this值將始終引用包含對象,在這種情況下obj

通過x直接存儲參考該功能被稱爲「一樣,」在全球範圍內,這意味着它將總是引用global object非ES5嚴格模式環境,這將是在ES5嚴格模式undefined

因此,在變量中引用對象方法時,您總是需要小心。如果這種方法想要通過this.someProp從自己的對象訪問某些數據,那麼如果this綁定到另一個對象/上下文,它顯然會失敗。


聲明:「將始終引用包含對象」不完全正確。如果函數通過Function.prototype.bind()綁定到另一個對象,它將會總是引用該綁定對象。

+0

相關ES5規範部分:http://ecma262-5.com/ELS5_HTML.htm#Section_11.2.3 – 2012-02-01 17:35:26

+0

@Tim Down:謝謝,我還沒有找到我自己。不幸的是,該規範的可讀性是.. ekhm ..可疑的質量:)無論如何,這是一個遺憾的是,財產查詢和呼叫運營商的組合提供了不同的結果,而不是單獨使用它們。 – 2012-02-01 19:24:00