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