括号是否包含"函数incrementNumber()"可选的?

时间:2016-07-01 07:03:11

标签: javascript closures

我是JavaScript新手,正在尝试学习JavaScript闭包。我有两个版本的相同代码,唯一的区别是版本2有括号括起来的功能。我已经运行了两个版本,它们似乎产生相同的结果。我想知道括号是否包含"函数incrementNumber()"是可选的吗?

版本1:

var incrementFunctionVariable = function incrementNumber(){
    var clickCount = 0;
    return function (){
        return ++clickCount;
    }
}()

版本2:括号括起来"函数incrementNumber()"

var incrementFunctionVariable = (function incrementNumber(){
    var clickCount = 0;
    return function (){
        return ++clickCount;
    }
})()

<input type="button" value="click me" onclick="alert(incrementFunctionVariable())" /><br>

1 个答案:

答案 0 :(得分:3)

这与JavaScript plus sign in front of function name非常相似,但也许并不重复。

在这种特殊情况下,您不需要您所指的括号,但在某些其他情况下则需要这样做。

在JavaScript中,如果解析器期望语句或声明并且它看到function关键字,则它假定它是函数声明(或在ES2015中,函数声明)。那些不是表达式(尽管在JavaScript中,表达式在期望语句/声明的地方是有效的)。函数声明/语句不会产生您可以在代码中立即使用的值。

但是如果解析器期望一个表达式(例如,在=的右侧),function启动一个函数表达式。函数表达式会生成一个值,您可以立即在代码中使用该函数。

你在函数表达式中看到()的原因是人们习惯在他们立即调用函数时编写它们:

// WON'T WORK
function() { alert("foo"); }();

// Works
(function() { alert("foo"); }());

// Works
(function() { alert("foo"); })();

他们这样做是为了将解析器的状态从期望语句/声明更改为期望表达式,以便function启动函数表达式,因此得到一个值,然后可以使用它们来调用该功能通过()

您不需要在示例中执行此操作,因为在=之后,解析器已经期待表达式。但即使它没有必要,也常常这样做,也许是因为它的真的很容易在最后通过()阅读。就是这样:

var foo = function foo() {
    // lots of stuff here
};

和这个

var foo = function foo() {
    // lots of stuff here
}();

真的容易混淆。将()添加到后者会使它们不那么相似:

var foo = (function foo() {
    // lots of stuff here
})();

但如果人们这样做,那就没有必要,这是习惯和/或风格。