亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用(函數(窗口,文檔,未定義){...})(窗口,文檔)賦予什么優勢?

使用(函數(窗口,文檔,未定義){...})(窗口,文檔)賦予什么優勢?

慕田峪7331174 2019-08-26 15:28:33
使用(函數(窗口,文檔,未定義){...})(窗口,文檔)賦予什么優勢?我想使用這種模式是新的熱點,但我不明白它的優點是什么,我不理解范圍的含義。模式:(function(window, document, undefined){   window.MyObject = {     methodA: function() { ... },     methodB: function() { ... }   };})(window, document)所以我對此有幾個問題。封裝像這樣的對象有什么特別的優勢嗎?為什么窗口和文檔被輸入而不是正常訪問?為什么undefined要傳遞這個?將我們正在創建的對象直接附加到窗口是一個特別好的主意嗎?我已經習慣了我稱之為Crockford風格的Javascript封裝(因為我從Douglas Crockford Javascript視頻中得到了它)。NameSpace.MyObject = function() {   // Private methods   // These methods are available in the closure   // but are not exposed outside the object we'll be returning.   var methodA = function() { ... };   // Public methods   // We return an object that uses our private functions,   // but only exposes the interface we want to be available.   return {     methodB: function() {       var a = methodA();     },     methodC: function() { ... }   }// Note that we're executing the function here.}();其中一種模式在功能上優于另一種嗎?第一個是另一個的演變嗎?
查看完整描述

3 回答

?
冉冉說

TA貢獻1877條經驗 獲得超1個贊

為什么窗口和文檔被輸入而不是正常訪問?

通常,為了加強標識符解析過程,將它們作為局部變量可以提供幫助(盡管IMO的性能改進可以忽略不計)。

傳遞全局對象也是非瀏覽器環境中廣泛使用的技術,您window在全局范圍內沒有標識符,例如:

(function (global) {
  //..})(this); // this on the global execution context is 
          // the global object itself

為什么heck未定義被傳入?

之所以這樣做是因為undefinedECMAScript 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并不代表什么特別的,是不是關鍵字一樣truefalse等...,它只是一個標識符。

僅僅為了記錄,在ECMAScript 5中,這個屬性是不可寫的......

將我們正在創建的對象直接附加到窗口是一個特別好的主意嗎?

當您在另一個函數范圍內時,這是用于聲明全局屬性的常用方法。


查看完整回答
反對 回復 2019-08-26
?
長風秋雁

TA貢獻1757條經驗 獲得超7個贊

我和你一起使用Crockford的風格。

回答你的問題

1.封裝像這樣的對象有什么特別的優勢嗎?

我能看到的唯一優勢是通過創建窗口和文檔局部變量而不是全局變量,你可以通過不能直接覆蓋任何一個以及它們都是本地的一些性能增益來獲得一些額外的安全性。

2.為什么窗口和文件被送入而不是正常訪問?

以上解決。局部變量往往更快,但隨著jit匯編這些天變得名義上。

為什么這個未定義被傳入?

沒有線索....

4.將我們正在創建的對象直接附加到窗口是一個特別好的主意嗎?

可能不是,但我仍然堅持使用Crockford的模式,因為將函數附加到窗口對象會通過窗口對象將其暴露給全局堆棧的其余部分,而不是通過非標準命名空間公開它。


查看完整回答
反對 回復 2019-08-26
  • 3 回答
  • 0 關注
  • 373 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號