2011-11-02 101 views
0

我的代碼:自執行功能不起作用?

function (i) 
{ 
    alert(i); 
}(3); 

我不明白爲什麼我沒有看到警報。

這個語法是什麼意思?

爲什麼驗證碼:

(function (i) 
{ 
    alert(i); 
}(3))();   

不工作?

有什麼區別?

我失蹤了什麼?

+0

On FireFox:「SyntaxError:函數聲明需要一個名稱。」 – Thilo

回答

10

第一個片段將被解釋爲函數聲明,它需要一個名稱並且您的函數沒有一個。所以這會導致錯誤。

用圓括號括起函數定義使函數被解釋爲函數表達式它不需要名稱,所以它是有效的JavaScript。

雖然看起來你在那裏做兩個調用。應該或者是

(function(i){ alert(i); }(3)); 

(function(i){ alert(i); })(3); 

通常可以有功能的表達或者在括號(一切被評價爲有表達),或在一個賦值表達式(var a = function...)的右側。

參見Section 13 of the ECMAScript 5 specification

FunctionDeclaration :
functionIdentifier (FormalParameterListopt) {FunctionBody}

FunctionExpression :
functionIdentifieropt (FormalParameterListopt) {FunctionBody}

+0

作出快速測試案例,更容易在那裏演示:http://jsfiddle.net/xMZbc/ :) –

+0

@Felix Kling http://robertnyman.com/2008/10/09/explaining-javascript-scope-and-封閉件/沒有說'link.onclick =函數(NUM){ \t \t \t回報函數(){ \t \t \t \t警報(NUM)的代碼; \t \t \t}; \t \t}(i);'......爲什麼它在那裏工作? –

+0

@RoyiNamir:你的意思是內在或外在的功能?外層是因爲它是一個賦值表達式,而內層是因爲'return'。 –

0

() - 運算符是負責執行的功能,因此這是由()纏繞的函數表達式立即exectued。

+3

這是不正確的。括號有不同的含義,取決於它們的位置和上下文。放在函數引用之後,它們執行該函數,但在任何其他情況下,它們都作爲分組操作。以'var foo =(5 + 3)* 2;'。這裏沒有涉及功能執行。 –