11

可能重复:
(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 所指出的,关于这个主题还有另一个线索。这是一篇关于这个问题的优秀博客,与另一篇文章相关联。

4

3 回答 3

13

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

var obj = ...

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

当然,var obj如果您只希望函数运行(即您希望它的副作用)但它要么不返回任何值,要么您不关心它的返回值是什么,您当然会省略。

于 2012-06-18T14:53:29.733 回答
3

JavaScript: The Good Parts 由 Doug Crockford 编写,他将示例更新为如下所示:

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

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

所以整个表达式都在括号内。

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

于 2012-06-18T14:56:58.550 回答
1

在这个例子中,没有任何功能差异,但我确实认为括号使它更具可读性。你怎么知道它是如何在没有括号的情况下确定范围的?是吊起来的吗?这是一个关于这个主题的精彩线程

在旁边:

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

于 2012-06-18T14:51:59.517 回答