2012-04-25 84 views
1

我正在考慮向JSON添加註釋,並發現this script在處理使JSON有效之前將它們除去。我只是想了解如何使JSON.minify()函數可用?(函數(全局){some code ..})(this)中的全局是什麼?

它開始

(function(global){ ... 

完全是怪我。我在MDN上發現了「global is a property of a RegExp instance, not the RegExp object」,但我不明白它是如何在這個腳本中工作的。

+1

這是一個參數。 – SLaks 2012-04-25 22:20:25

+0

該函數在全局上下文中調用。因此,'this'參數是分配給'global'參數的全局對象。 – 2012-04-25 22:22:11

回答

2

這個片斷:

(function(global){ 
    // your code here 
    // referring to the variable named "global" in this scope 
    // will be a reference to the default javascript global object 
})(this); 

是用於分配全局對象(無論它可能是)一個說法構建標記global所有代碼,這是自執行函數中。

自執行函數用於定義一個單獨的執行範圍,以便您在此範圍內定義的任何函數或變量都不會干擾該範圍以外的任何函數或變量,也不能直接從該範圍之外直接訪問(將範圍與其他代碼範圍隔離)。

在瀏覽器中,全局對象是window對象,但如果你打算有代碼可能在其他JavaScript環境中工作(如服務器上沒有的node.js)在全球對象可能不是window,這是一種從默認值this中提取全局值的方法,將其放入另一個變量中,然後您可以在代碼塊中的任何位置引用該變量。

對於只能在瀏覽器中運行的代碼,實際上沒有意義。當你需要全局對象時,你可以參考window

+0

即使只在瀏覽器中運行,仍然可能有一點。你可以節省一些字節,因爲'global'參數可能是一個字符;每次你引用'window'時保存5個字節。 – josh3736 2012-04-25 22:50:39

+0

@ josh3736 - 我想你說的是微小化。我通常將可讀性優先考慮到在縮小之前沒有看到我的代碼的人,所以我通常不會爲了縮小而參與這樣的事情。但是,是的,這是個人選擇。 – jfriend00 2012-04-25 23:02:26

+0

如果它只是瀏覽器,只需命名參數'window'(而不是'global')。這樣你會得到縮小的好處,但保持可讀性 - 你仍然可以編寫'window.location'或其他任何東西。實際上,這就是jQuery [做它](http://code.jquery.com/jquery-1.7.2.js) - '(function(window,undefined){...})(window);' – josh3736 2012-04-25 23:12:31

2

這只是一個函數參數名稱。它可能是froozboggles

此代碼:

(function(foo) { 
    // In here, what's called "bar" in the outer scope is called "foo" 
})(bar); 

定義一個匿名函數取一個參數bar並立即與bar值作爲第一個參數調用它。

除了jfriend00在他的正確答案中提到的內容,它也是確保您不會將變量和函數泄漏到外部範圍的好方法:如果您在javascript的頂部範圍中聲明瞭var baz = 17;,它將是window的財產。如果您按照您提到的模式將其包裝在函數中,則只能將屬性明確地導出至window - 通過將屬性分配給global(就您的示例而言)。作爲@ josh3736在他的評論中說,你也可以在沒有事先聲明的情況下分配給window,例如泄漏給windowquux = 4711;

+0

+1組成一個獨特的詞。零谷歌點擊froozboggles。 – 2012-04-25 22:22:27

+0

不長。 ;-) – 2012-04-25 22:23:08

+0

*「您只能將屬性顯式導出到窗口」* - 這不完全正確。如果在範圍內沒有'baz',則純粹的'baz = ...;'將分配給全局對象('window')。換句話說,'(function(global){baz ='';})(this)'仍然會泄漏'baz',即使它沒有明確地分配給window。 – josh3736 2012-04-25 22:53:43