2012-06-21 99 views
10

我已經看到Javascript函數在函數的大括號後立即使用括號,我不明白它們用於什麼。花括號後的括號是什麼意思?

例子:

function foo(bar){ 
    return bar; 
}(0); 
  • 是什麼(0)辦?

  • 這是什麼叫?

  • 什麼時候應該使用這種技術?

+2

如果你只是提供了一個壞榜樣,那麼你的問題是重複的(HTTP [什麼是圍繞一個JavaScript對象/功能/類聲明括號是什麼意思?] //stackoverflow.com/questions/440739/what-do-parentheses-surrounding-a-javascript-object-function-class-declaration-m)。 –

回答

9

在你的榜樣,你只需要兩個語句,它等同於:

function foo(bar){ 
    return bar; 
} 
0; 

這是而不是一個自我調用函數。第一條語句是函數聲明,第二條語句只是簡單的數字文字0,它什麼都不做。圓括號不執行該功能,它們是grouping operator

我們如何證明這一點?試試:

function foo(bar){ 
    return "bar"; 
}(0); 

並告訴我輸出是什麼。


這將是自調用函數,如果我們有一個函數表達式。爲此,您可以使用分組操作符強制將其評估爲表達式。

例如:

(function foo(bar){ 
    return bar; 
})(0); 

這是一個命名函數表達式。表達式((function ....))的結果是函數引用,並且(0)執行函數,傳遞0作爲參數。

括號的位置也可能是:

(function foo(bar){ 
    return bar; 
}(0)); 

也許這就是你所看到的東西。

這項技術已經被廣泛地在這裏討論:What is the purpose of a self executing function in javascript?

+0

謝謝菲利克斯,你一定有鷹眼:) – jon

11

他們立即調用類似的,當你調用一個函數功能:

function foo() { 
    alert('hello'); 
} 

foo(); // call 

你也可以把它直接

(function foo(){ 
    alert('hello'); 
})(); // <-------------- 

目前你有Function Declaration要真正自我調用它,你需要有像這樣的括號(使它的表情):

(function foo(bar){ 
    return bar; 
})(0); 

,現在是Function Expression,將立即調用。要知道Function DeclarationFunction Expression之間的差異,通過Kangax看看這個優秀的文章:


是什麼(0)呢?

它是傳遞給foo功能,因此bar0內部函數的參數。

這是什麼叫?

這是一個自我啓動或自我執行的功能。您可能還想看到this

什麼時候應該使用這種技術?

當你想立即調用一個函數並且只在該函數表達式中保持變量作用域。它不會被外部世界所用,或者說是該函數表達式之外的代碼。


瞭解更多:

+0

提示:'(function(...){...})(...);'每次都有效,即使使用匿名函數,返回值沒有賦值給變量 –

+0

這不正確。看到我的答案。但是,OP也許只是一個不好的例子。 –

+0

@FelixKling:+1給你。我忽略了OP的語法,增加了更多細節。 – Sarfraz

0

這是一個自調用函數。你傳遞0作爲參數。這等於0

對於如因此,你的函數將返回欄下面的功能是相同的:

function foo(bar) { 
    return bar; 
} 

foo(0); // returns 0 
相關問題