自动执行功能

时间:2012-06-18 14:50:28

标签: javascript

  

可能重复:
  Difference between (function(){})(); and function(){}();

我试图更好地理解JavaScript的一些功能。在The Definitive JavaScript中,它表示自执行函数应该有括号围绕它们:

var obj = (function() {
    var value = 0;

    return {
        increment: function(inc) {
            value += typeof inc === "number" ? inc : 1;
        },
        getValue: function() {
            return value;
        }
    }
})();

但是在这个例子的JavaScript - The Good Parts中,它有上面的自执行函数,没有括号圆,如下所示:

var obj = function() {
    var value = 0;

    return {
        increment: function(inc) {
            value += typeof inc === "number" ? inc : 1;
        },
        getValue: function() {
            return value;
        }
    }
}();

这两个例子都适用于我,但我想问一下我应该注意的功能是否有任何差异。我希望这不是太微不足道。我只是想确定一下。

非常感谢。

修改

正如Rob W指出的那样,这个主题还有另一个主题。与其他帖子相关联的This is an excellent blog regarding this issue

3 个答案:

答案 0 :(得分:13)

在这种情况下没有任何区别,但,因为它的前缀为:

var obj = ...

没有它,只有第一个版本是正确的,因为你需要额外的括号来允许解释器正确解析function作为函数表达式而不是函数声明

如果你只想要运行函数(即你想要它的副作用),你当然只会省略var obj但是它不返回任何值,或者你不关心它的返回值是什么。 / p>

答案 1 :(得分:3)

JavaScript:好的部分是由Doug Crockford编写的,他将他的例子更新为:

var obj = (function() {
    var value = 0;

    return {
        increment: function(inc) {
            value += typeof inc === "number" ? inc : 1;
        },
        getValue: function() {
            return value;
        }
    };
}());

因此整个表达式都在括号内。

外部括号的概念是不需要的,它使开发人员清楚地知道这是一个故意自行执行的功能。所以价值就是可读性。

答案 2 :(得分:1)

在这个例子中,没有任何功能差异,但我确实认为括号使它更具可读性。你怎么知道如果没有parens它是如何作用的?它被悬挂了吗? This is a brilliant thread关于这个问题。

<强> ASIDE:

JSLint会抱怨“函数语句不可调用。将整个函数调用包装在parens中。”我认为大多数没有在严格模式下运行的浏览器解析器通常会让它通过,但最好不要依赖它。