2012-02-01 121 views
4

我最近看到的代碼看起來像這樣:將全局變量傳遞給函數是否有價值?

(function (someGlobal) { 
    someGlobal.DoSomething(); 
})(someGlobal); 

其中someGlobal是一個大的框架類。它可能是JQuery。這樣做的好處是什麼?這是一個好習慣嗎?似乎這樣的代碼就相當於且不易出錯,因爲你不躲全球:

(function() { 
    someGlobal.DoSomething(); 
})(); 

回答

2
  • 你的情況下,可靠的參考全球的一個被覆蓋

  • 它縮短了作用域鏈來訪問它


「這樣看來,代碼將是等效的,並且不太容易出錯,因爲您不隱藏全局代碼:

(function() { 
    someGlobal.DoSomething(); 
})(); 

如果預計全球被覆蓋,而你的代碼依靠被覆蓋的值,那麼顯然你不希望通過函數中的局部變量影子吧。

除此之外,函數中的本地引用不應該更容易出錯。

+1

1.只有在**肯定**的情況下,代碼纔會在覆蓋全局之前執行。 2.只有一個範圍對象,所以增益很小(因爲編譯器可能在函數實例化時優化範圍鏈)。所以好處很小。 – RobG 2012-02-01 02:33:10

+0

@RobG:1.那麼如果它不是先執行,那麼就有一個問題需要解決。我們完全可以說*「只有當你確定全球存在於第一位時」*,但那不是重點,不是嗎?如果全局被覆蓋,那麼IIFE問題就沒有意義了。是的,一個小的性能增益。 – 2012-02-01 02:54:55

+1

準備在它所依賴的全局變量的環境中運行的代碼可能會在不知道它是在代碼之前還是之後運行的環境中進行重新分配。在這種情況下,傳入全球並不能確定它沒有被重新分配。畢竟,這不是全局的問題嗎? – RobG 2012-02-01 04:07:13

0

的好處是,該函數內,someGlobal是毫不含糊的。

+0

它是如何比引用它作爲參數傳入時更明確?如果你不知道這個功能是什麼,你就不會知道呼叫站點是什麼。 – 2012-02-01 02:28:40

+0

@SteveRowe,這種模式在更廣泛的場景中更爲有用,在這些場景中,調用站點與函數聲明「遙遠」並且涉及到閉包。正如其他人最好說的那樣,'someGlobal'可能會在功能開始和使用之間的中間變化。從函數內代碼的角度來看,參數值(或傳遞的參數的引用)不會改變。 – Humberto 2012-02-01 03:01:16

0

這樣您就可以在安全範圍內使用別名。

(function ($) { 
    $.DoSomething(); 
})(someGlobal); 

更新:

最進口事情是這樣定義的安全範圍供您使用someGlobal

如果使用第二種方式中,someGlobal仍然是你在一個回調函數使用someGlobal一個全球性的,只是成像和您覆蓋someGlobal之外的某處,會發生什麼?

+0

這將是一個好處,但在這種情況下,他們使用完全相同的名稱。 – 2012-02-01 02:08:31

+0

@SteveRowe是的,除此之外,更重要的是爲您定義一個安全的範圍,使用'someGlobal'。 – xdazz 2012-02-01 02:11:23

+0

嘗試在這裏瞭解。如果該函數只被調用一次(注意引用沒有被捕獲到,並且它是匿名的),那麼這個安全範圍是否有幫助?即使它被多次調用,有沒有像JQuery/$這樣的東西會被覆蓋的真正危險? – 2012-02-01 02:31:40

1

我同意如果它是一個全局變量那麼爲什麼要通過它?只是把它用作全球性的。

但是看起來好像這可能是一個有效的過渡機制來移除全局。例如,如果我繼承了大量的全局代碼庫,那麼一個潛在的轉換機制就是以這種確切的方式慢慢消除全局用法。這種改變可以用最小的差異以增量方式完成。