2011-11-02 68 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;'。这里没有涉及功能执行。 –