2012-02-22 74 views
23

它的好習慣使用自調用函數來包裝嚴格模式兼容的代碼時,聲明全局變量,通常被稱爲嚴格模式編譯:如何使用嚴格模式編譯

(function(){ 
    "use strict"; 
    // Strict code here 
}()); 

我的問題是如何在這種情況下聲明全局變量?三個備選方案,我知道今天的:

選擇1:

var GLOB = {}; 

(function(){ 
    "use strict"; 
}()); 

備選方案2:

(function(){ 
    "use strict"; 
    window.GLOB = {}; 
}()); 

方案3:

(function(win){ 
    "use strict"; 
    win.GLOB = {}; 
}(window)); 

任何偏好和動機是什麼?其他選項?

+0

http:// stackoverflow。com/questions/9642491/ – 2012-05-17 20:27:41

回答

1

如果將方法1粘貼到另一個函數中,則方法1將失敗。

使用方法3,將方法導出到另一個命名空間更容易。只需將window替換爲frames[0]document就足以將所有方法都附加到自定義名稱空間。

我推薦方法3,因爲最後的原因。

1

alt 2和3的好處是它們將所有代碼都保存在「容器函數」中。閱讀代碼時,函數外部的一行代碼很容易遺漏。

另外:

  • 「GLOB」 應該是應用程序的名稱。 - 你想允許多個應用程序每個html/js文件沒有名稱衝突。
+0

我只使用GLOB作爲任何名稱空間或全局創建的佔位符。同意包裝封閉應涵蓋整個文件的編譯意義。 – johnwilander 2012-02-22 16:03:36

0

Andrea Giammarchi有一個很好的技術可以做到這一點,它適用於各種瀏覽器。定義你的自我調用函數的函數叫做globalEval像這樣:

(function() { 
    "use strict"; 
    function globalEval(data) { 
     data = data.replace(/^\s*|\s*$/g, ""); 
     if (data) { 
      var head = document.getElementsByTagName("head")[0] || document.documentElement, 
       script = document.createElement("script"); 
      script.type = "text/javascript"; 
      script.text = data; 
      head.appendChild(script); 
      head.removeChild(script); 
     } 
    } 

    // use globalEval to stick variables into the global scope 
    globalEval("var myGlobal = 1;"); 
    // myGlobal === 1 
)(); 
// myGlobal === 1 

或者,如果你想在其他範圍內使用它定義自我調用代碼之外globalEval功能。

+0

我認爲你已經錯過了這個問題的要點。 – 2012-02-22 15:50:51

+0

問題是如何從一個獨立的範圍內聲明全局變量,不是嗎? – DaveS 2012-02-22 15:54:22

+1

給出這些例子,OP想知道哪些方法最適合將已知變量導出到全局範圍。你的答案*解釋瞭如何定義全局變量。但是,定義'GLOB = {};'是一種非常昂貴的方式。 – 2012-02-22 16:00:07

47

IMO替代方案3是最好的。但是它假定window代表全局範圍 - 對瀏覽器來說這是正確的,但對於其他JS環境(命令行,Node.js等)來說則是如此。

以下將全線工作:

(function(globals){ 
    "use strict"; 
    globals.GLOB = {}; 
}(this)); 
+2

+1,便於攜帶。真棒。 – andyortlieb 2013-02-28 14:56:53

+0

如果這=== undefined這不會定義一個全局的,下面的Adassko答案是更好 – kofifus 2016-09-11 23:56:22

+0

使用'eval'有一些相關的開銷。在我的代碼中,我保留它用於我知道我需要它的情況。 在隔離SEAF腳本文件的全部內容的常見場景中,'this'將指向全局範圍。常見用法見[各種UMD包裝](https://github.com/umdjs/umd)。 – 2016-09-29 15:02:44

9

我知道這是一個老問題,但有獲得全球範圍內的一個未提及方式:

(function(globals){ 
    "use strict"; 
    globals.GLOB = {}; 
}((1,eval)('this'))); 

(1,eval)('this')

會從全球範圍內評估this,所以你可以粘貼這個你喜歡的任何地方,你總是會得到全球背景

+0

只有一個爲我工作,thx! – kofifus 2016-09-12 00:10:51

相關問題