3 回答

TA貢獻1877條經驗 獲得超1個贊
為什么窗口和文檔被輸入而不是正常訪問?
通常,為了加強標識符解析過程,將它們作為局部變量可以提供幫助(盡管IMO的性能改進可以忽略不計)。
傳遞全局對象也是非瀏覽器環境中廣泛使用的技術,您window
在全局范圍內沒有標識符,例如:
(function (global) { //..})(this); // this on the global execution context is // the global object itself
為什么heck未定義被傳入?
之所以這樣做是因為undefined
ECMAScript 3中的全局屬性是可變的,這意味著某人可以更改其影響代碼的值,例如:
undefined = true; // mutable(function (undefined) { alert(typeof undefined); // "undefined", the local identifier})(); // <-- no value passed, undefined by default
如果仔細觀察undefined
實際上沒有被傳遞(函數調用沒有參數),這是獲取undefined
值的可靠方法之一,而不使用該屬性window.undefined
。
這個名字undefined
在JavaScript并不代表什么特別的,是不是關鍵字一樣true
,false
等...,它只是一個標識符。
僅僅為了記錄,在ECMAScript 5中,這個屬性是不可寫的......
將我們正在創建的對象直接附加到窗口是一個特別好的主意嗎?
當您在另一個函數范圍內時,這是用于聲明全局屬性的常用方法。

TA貢獻1757條經驗 獲得超7個贊
我和你一起使用Crockford的風格。
回答你的問題
1.封裝像這樣的對象有什么特別的優勢嗎?
我能看到的唯一優勢是通過創建窗口和文檔局部變量而不是全局變量,你可以通過不能直接覆蓋任何一個以及它們都是本地的一些性能增益來獲得一些額外的安全性。
2.為什么窗口和文件被送入而不是正常訪問?
以上解決。局部變量往往更快,但隨著jit匯編這些天變得名義上。
為什么這個未定義被傳入?
沒有線索....
4.將我們正在創建的對象直接附加到窗口是一個特別好的主意嗎?
可能不是,但我仍然堅持使用Crockford的模式,因為將函數附加到窗口對象會通過窗口對象將其暴露給全局堆棧的其余部分,而不是通過非標準命名空間公開它。
添加回答
舉報