2

可能重复:
自执行功能不起作用?

在Javascript中,为什么

function() { console.log('hello'); }();

给出一个错误,但是

function() { console.log('hello'); }()

不是?

编辑:一些答案指出在 Firefox 中都给出了语法错误,但在 Chrome 或 Node.js REPL 中似乎都不是这种情况。此外,

(function() { console.log('hello'); }());

似乎在 Firefox 中运行良好。

4

5 回答 5

2

实际上,这两者都是 SyntaxErrors。

您需要将括号包裹在匿名函数周围,以便可以正确解析它。

(function(){alert('eyo')})();

这定义了函数并立即调用它。定义一个函数并在没有“形成”函数的情况下通过将括号包裹在函数周围来调用它在语法上是无效的。

这里有很好的解释:http: //benalman.com/news/2010/11/immediately-invoked-function-expression/

幸运的是,SyntaxError “修复”很简单。告诉解析器期待一个函数表达式的最广泛接受的方法就是用括号括起来,因为在 JavaScript 中,括号不能包含语句。此时,当解析器遇到 function 关键字时,它知道将其解析为函数表达式而不是函数声明。

于 2012-07-31T21:42:59.393 回答
0
(function() { console.log('hello'); })();

你必须调用一些函数,在这种情况下是“()”

不,任何语法错误

于 2012-07-31T21:41:29.180 回答
0

后面跟着的匿名函数()本质上是您说“立即调用此函数”,但您的语法不正确,因为没有包装父母,()则不会附加到任何东西(有一个例外,如果您将匿名函数设置为相等到一个变量,没关系,但你没有这样做......见评论)。

所以它必须是这样的:( function(){} )()

这样想:

1. ( someExpressionReturnsFunction )(2)
2. is now: aFunction(2)
于 2012-07-31T21:45:49.637 回答
0

正如其他人指出的那样,赋值与表达式存在差异

自执行函数是转换为表达式的函数:

// self-executed due to both being an expression, no function declaration.
!function(foo) { console.log('test', foo); }('first');
(function(foo) { console.log('test', foo); })('second');

// long-hand examples of normal usage without expression conversions.
var bar = function(foo) { console.log('test', foo); };
bar('third');

如果之前的事物是可调用的已声明函数或表达式,则只能在之后传递带有最少括号“()”的参数。

edit:// 我添加了 negotiator 示例,因为这将导致以下关键字在表达式中被转换。表达式总是返回真或假。

于 2012-07-31T21:56:38.703 回答
0

在 Firefox 中,这两行都会产生相同的错误:

SyntaxError:函数语句需要名称

要解决此问题,只需添加括号:

(function() { console.log('hello'); })();

可能会引发该错误,因为它表示语法错误:

function (value) {
    return value * value;
}

很明显,缺少函数名称,并且没有打算使用匿名函数。

因此,匿名函数总是必须作为表达式出现,例如分配一个变量:

var a = function() { };

否则,您需要括号。

于 2012-07-31T21:42:39.287 回答