Javascript语法:匿名自调用函数

Javascript语法:匿名自调用函数,javascript,Javascript,可能重复: 在Javascript中,为什么 function() { console.log('hello'); }(); 给出一个错误,但是 function() { console.log('hello'); }() 不是吗 编辑:一些回答指出,在Firefox中,两者都会出现语法错误,但在Chrome或Node.js REPL中似乎都不是这样。另外, (function() { console.log('hello'); }()); 在Firefox中似乎运行良好 (functi

可能重复:

在Javascript中,为什么

function() { console.log('hello'); }();
给出一个错误,但是

function() { console.log('hello'); }()
不是吗

编辑:一些回答指出,在Firefox中,两者都会出现语法错误,但在Chrome或Node.js REPL中似乎都不是这样。另外,

(function() { console.log('hello'); }());
在Firefox中似乎运行良好

(function() { console.log('hello'); })();
您必须调用某个函数,在本例中为“()”


否,在Firefox中的任何

,两行生成相同的错误:

SyntaxError:函数语句需要名称

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

(function() { console.log('hello'); })();
引发此错误可能是因为它指示语法错误:

function (value) {
    return value * value;
}
很明显,函数名丢失了,并且没有打算使用匿名函数

因此,匿名函数始终必须作为表达式出现,例如,分配变量:

var a = function() { };

否则,您需要括号。

实际上这两个都是语法错误

您需要围绕匿名函数包装parens,以便正确解析它

(function(){alert('eyo')})();
这将定义函数并立即调用它。在语法上,定义一个函数并调用它而不通过围绕它包装paren来“形成”函数是无效的

这里有很好的解释:

幸运的是,SyntaxError“fix”很简单。最广泛接受的 告诉解析器期望函数表达式的方法就是包装 在parens中,因为在JavaScript中,parens不能包含语句。 此时,当解析器遇到function关键字时,它 知道如何将其解析为函数表达式而不是函数 声明


后面跟着
()
的匿名函数本质上是说“立即调用此函数”,但语法不正确,因为没有包装父函数,
()
不会附加任何内容(有一个例外,如果您将匿名函数设置为变量,则可以,但您没有这样做…请参阅注释)

所以它一定是这样的:
(function(){})(

你可以这样想:

1. ( someExpressionReturnsFunction )(2)
2. is now: aFunction(2)

正如其他人指出的,赋值和表达式是有区别的

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

// 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://我添加了协商者示例,因为这将导致在表达式中转换以下关键字。表达式始终返回true或false。

在这两种情况下都会出现错误……这不是真正的解释。edit:OP在函数定义后有括号,这不应该算作“调用”吗?是的;这似乎根本没有回答问题。您也可以这样做(function(){console.log('hello');}()),但这并不完全正确。
var foo=function(){return'bar';}()
工作得很好。@FelixKling lol我很喜欢你的评论。@Esailija:我把它当作一种恭维:Dhe是国王,毕竟干得不错,但是如果你在twitter工作,你也可以用
代替parens。