立即调用函数表达式:括号中的位置?

时间:2016-07-05 03:56:57

标签: javascript iife

我见过IIFE写的:

(function() {
    console.log("do cool stuff");
})();

以及:

(function() {
    console.log("do more cool stuff");
}());

在我使用它们的任何环境中它们似乎都是一样的,尽管在某些情况下我被告知一种方式是正确的而另一种方式是错误的,反之亦然。有没有人有任何坚实的理由或逻辑,因为它是一个订单而不是另一个订单?在某些情况下,在函数体关闭之后但在调用括号之前或之后但在最后的右括号之前可能会有更多的事情发生?我主要在一个Angular模块闭包中使用它们,似乎无法找到任何真正的理由去某种方式,想知道是否有人有不同的经验。

1 个答案:

答案 0 :(得分:8)

简短回答:只要你把它们放在那里就无所谓了。

答案很长:除了箭头函数之外没什么关系,因为对于JavaScript来说唯一重要的是它们就在那里。这样做的原因是语言规范定义了如果声明命名的函数,语句必须仅以fadeIn UnityEngine.Debug:Log(Object) Test:Start() (at Assets/_Scripts/Test.cs:34) 关键字开头。因此,如此定义IIFE是违反规范的:

function

解决方法是将整个事物包装在括号中,这样语句就不再以function () {}(); 关键字开头了。您可以使用

实现此目的
function

以及使用:

(function () {})();

你选择哪一个是完全随意的,因此取决于你。

我(个人)将括号括在函数周围,而不是在调用周围,即像这样:

(function () {}());

原因:我想将最小部分代码包含在仅出于技术原因需要的东西中,这是函数定义,而不是调用。除了规范说你不能以这种方式定义一个函数,它不是调用函数。因此,我认为如果你包装定义而不是电话会更清楚。

修改 但是,对于es6中的箭头函数,调用必须在包装器之外。它位于包装器内部会导致调用的左括号出现意外的令牌错误。关于为什么会出现这种情况的机制尚不完全清楚。