这两者有什么区别:
(function () {
alert('something');
})(); # invocation parens after the wrapping parens
和
(function () {
alert('something');
}()); # invocation parens inside the wrapping parens
——两者都给了我相同的结果:提醒“某事”。
这两者有什么区别:
(function () {
alert('something');
})(); # invocation parens after the wrapping parens
和
(function () {
alert('something');
}()); # invocation parens inside the wrapping parens
——两者都给了我相同的结果:提醒“某事”。
没有区别。两者都会做同样的事情(调用匿名函数表达式)。
匿名函数周围的括号只是为了确保函数被解析为表达式而不是声明(这很重要,因为不能调用声明)。您可能还会看到其他运算符用于相同的效果。例如:
// All three of the following have the same effect:
!function () {
alert('something');
}();
+function () {
alert('something');
}();
(function () {
alert('something');
}());
请注意,如果您使用像 JSLint 这样的静态分析工具,它可能会抱怨您问题中的第一种形式(在分组运算符之外使用调用括号)。原因是有些人认为第二种形式更容易理解。
JSLint 将})();
调用视为“错误”。函数定义和调用是单个表达式的一部分。仅出于这个原因,调用是表达式本身的一部分是非常合乎逻辑的。
本质上,这只是个人喜好问题。个人觉得
(function(elem)
{
})(document.getElementById('foo'));
比阅读更容易
(function(elem)
{
}(document.getElementById('foo')));
但是话又说回来,任何具有语法突出显示的编辑器都会使该参数无效。
底线:使用你觉得最舒服的那个,让 jslint 唠叨它,Douglas Crockford 是 JS 的权威,但这并不意味着我们都必须盲目地复制他的风格/推理
将某些内容包装到括号中(在 JS 中)会强制解释器将其视为表达式。
在第一种情况下,您强制解释器将函数视为表达式,然后解释器对其进行评估,得出结论它是一个函数,然后进一步查看: ()
,因此它调用该函数。
在第二种情况下,您强制解释器也将调用括号视为表达式,因此函数调用的结果将是表达式的结果,如果它会返回某些内容(否则它将是未定义的 - 感谢 Elias van Ootegem) .