我是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>
答案 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
})();
但如果人们这样做,那就没有必要,这是习惯和/或风格。