JS匿名函数调用语法

时间:2012-11-30 11:57:32

标签: javascript

这两者之间有什么区别:

(function () {
    alert('something');
})();​  # invocation parens after the wrapping parens

(function () {
    alert('something');
}());  # invocation parens inside the wrapping parens

- 给我同样的结果:警告“某事”。

3 个答案:

答案 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)。