2012-09-04 43 views
6

請解釋在這裏使用了什麼hack(我可以看到,null作爲上下文傳遞給返回其上下文屬性的函數,因此我無法清楚地理解實際發生的事情在這裏。null作爲上下文傳遞給函數調用

function getGlobal(){ 
    return (function(){ 
    return this.dust; 
     }).call(null); 
} 

回答

6

將上下文設置爲空將使this指向全局對象。所以提供的代碼將用作訪問全局對象的dust屬性。

根據ECMA 262 V5的規範,10.4.3輸入功能代碼

if thisArg is null or undefined, set the ThisBinding to the global object. 

看到http://es5.github.com/#x10.4.3

3

的技巧是使用,如果你不具備的功能的接收器,window(實際上執行腳本的全局對象,因此得名)使用的事實。

因此,這個技巧可以繞過在最近的嵌入上下文中定義的屬性(dust),並使用全局中定義的屬性目的。

+0

爲什麼不直接使用'直接window.dust'?全局對象有時可以不是窗口嗎? – KOGI

+0

很少有一點,這就是爲什麼這樣的代碼很少見。一個原因可能是你正在創建一個你想與非瀏覽器js引擎兼容的庫(例如node.js):那麼這個全局對象不叫'window'。但通常,當你創建一個庫時,你避免訪問全局對象... –

相關問題