請解釋在這裏使用了什麼hack(我可以看到,null作爲上下文傳遞給返回其上下文屬性的函數,因此我無法清楚地理解實際發生的事情在這裏。null作爲上下文傳遞給函數調用
function getGlobal(){
return (function(){
return this.dust;
}).call(null);
}
請解釋在這裏使用了什麼hack(我可以看到,null作爲上下文傳遞給返回其上下文屬性的函數,因此我無法清楚地理解實際發生的事情在這裏。null作爲上下文傳遞給函數調用
function getGlobal(){
return (function(){
return this.dust;
}).call(null);
}
將上下文設置爲空將使this
指向全局對象。所以提供的代碼將用作訪問全局對象的dust
屬性。
根據ECMA 262 V5的規範,10.4.3輸入功能代碼
if thisArg is null or undefined, set the ThisBinding to the global object.
的技巧是使用,如果你不具備的功能的接收器,window
(實際上執行腳本的全局對象,因此得名)使用的事實。
因此,這個技巧可以繞過在最近的嵌入上下文中定義的屬性(dust
),並使用全局中定義的屬性目的。
爲什麼不直接使用'直接window.dust'?全局對象有時可以不是窗口嗎? – KOGI
很少有一點,這就是爲什麼這樣的代碼很少見。一個原因可能是你正在創建一個你想與非瀏覽器js引擎兼容的庫(例如node.js):那麼這個全局對象不叫'window'。但通常,當你創建一個庫時,你避免訪問全局對象... –