2012-04-09 121 views
3

我想知道,當初始化一個對象時,附加括號有什麼意義。例如:揭示模塊模式函數初始化樣式

var foo = function(){ ... }(); 

var foo = (function(){ ... }()); 

我承擔相關範圍的東西,但我想知道如果有人能更精確地瞭解具體的差異,因爲它們似乎都初始化基於什麼每一個對象匿名函數返回。

+2

以下錯誤在這種特定的情況下,有沒有實際的區別。有些人喜歡外層的'(...)',因爲它在'='運算符附近爲它們提供了一個視覺提示,該函數被調用。 – 2012-04-09 19:20:14

+0

你應該發佈這個作爲答案,所以我可以upvote它。 :) – t3rse 2012-04-09 19:23:50

+0

好吧。 http://stackoverflow.com/a/10078589/1106925 – 2012-04-09 19:26:26

回答

5

在這種特定的情況下,有沒有實際的區別。

有些人喜歡外(...),因爲它給了他們在=運算符附近的視覺提示,該函數正在被調用。

但賦值運算符會導致function被評估爲作爲賦值運算符右手操作數的表達式,因此可以在不需要進一步強制將它從函數聲明中強制的情況下調用該表達式。


沒有分配,需要有一些語法參與,讓翻譯知道function關鍵字被用作一個匿名函數表達式。

例如...

(function() { 
    // code 
})(); 

這裏括號解決了function的模糊性,使得它當作(...)組內的一個表達。


分組操作符只是強制function作爲表達式求值的一種方法。大多數JavaScript運算符可用於此目的。一元運算符是最安全的可能,例如...

!function() { 
    // code 
}(); 

......或者......

void function() { 
    // code 
}(); 

在這兩種情況下,function被看作是單一操作到相應的運營商。

2

兩者在功能上是等同的。

但是,作爲一個慣例,許多程序員更喜歡左括號來表示var是函數的結果,而不是函數本身。

自調用函數的使用是傳遞變量以保留它們的「名稱空間」,例如,通常在窗口或文檔中傳遞,或者像jQuery一樣傳遞其他東西。

根據jslint的一些快速測試,這樣做的首選方法是在以下測試中的第一個(foo)。

var foo = (function() {}()); 
var bar = (function() {})(); 
var baz = function() {}(); 

請注意,invoking()在外部圓括號內。

的JSLint給出了酒吧和巴茲

Error:

Problem at line 2 character 28: Move the invocation into the parens that contain the function.

var bar = (function (w) {})(window);

Problem at line 3 character 27: Wrap an immediate function invocation in parentheses to assist the reader in understanding that the expression is the result of a function, and not the function itself.

var baz = function (w) {}(window);