在观看学习爱情JavaScript的过程中,我不知道为什么第二个版本无效。它只返回'功能'。是不允许关闭直接分配给它的变量?
function getCtr() {
var i = 0;
return function() {
console.log(++i);
}
}
var ctr = getCtr();
ctr();
ctr();
ctr();
/* console
1
2
3
*/
/*--------------------------------------
* This doesn't work
*/
var ctr = function() {
var i = 0;
return function() {
console.log(++i);
}
}
ctr();
ctr();
ctr();
/* console
* => [Function]
*/
答案 0 :(得分:4)
打印出来,因为函数 会返回一个函数。
尝试
ctr()();
您使用的两种形式的函数声明具有几乎完全相同的效果。两者都只是创建一个函数并将其绑定到一个符号。你在第二个版本中真正改变的是涉及的名称(“ctr”而不是“getCtr”)。
也就是说,如果您的测试与第一次设置相同:
var actualCtr = ctr();
actualCtr();
actualCtr();
actualCtr();
你会发现它真的是一样的。
答案 1 :(得分:1)
在第一个版本中,您定义了一个函数getCtr。然后你调用getCtr,保持结果为ctr。然后你反复调用ctr。您正在调用调用函数的结果。
在第二个版本中,您将ctr定义为第一个函数,然后重复调用它。您没有调用调用函数的结果。
以下是您的第二个代码的版本:
var ctr = (function() {
var i = 0;
return function() {
console.log(++i);
}
})();
ctr();
ctr();
ctr();