在函数内部使用闭包进行计数



我试过了,它总是显示1次,有问题,如何解决?

function myFunc() {
var increment = (function() {
var i = 0;

return function() {
i++;
return i;
};
})();

alert(`calling myFunc ${increment()} times`);
}

任何时候调用我的func,它都会重新定义增量函数,所以你不应该期望它只说1。您的问题是每次调用myFunc时都定义了增量

你想做的是:

var i = 0;
function myFunc() {
var increment = (function() {
return function() {
i++;
return i;
};
})();

alert(`calling myFunc ${increment()} times`);
}

因此,现在i将在对myFunc的调用之间保持其值。它必须在myFunc之外。或者,您可以将整个函数移动到myFunc之外。

var increment = (function() {
var i = 0;

return function() {
i++;
return i;
};
})();
function myFunc() {
alert(`calling myFunc ${increment()} times`);
}

现在这个工作:

console.log(increment()); // logs 1
console.log(increment()); // logs 2

问题是,当一个变量超出作用域时,它会被销毁,下次调用值时,它将被重新创建,并初始化为它开始时的任何值。由于变量i的作用域在increment函数内部,它本身的作用域是CCD_ 9,这意味着当CCD_。

一个示例显示i被提升到myFunc的作用域中,并且increment函数运行了几次。

function myFunc() {
console.log('running myFunc');
var i = 0;
console.log('assigning i to ' + i);
function increment() {
console.log('incrementing');
i++;
};
increment();
increment();
console.log(`calling myFunc ${i} times`);
}
myFunc();

请注意,i现在在对increment的调用中保持其状态。现在,当我们多次调用myFunc时,我们看到i被破坏,然后当myFunc再次运行时,会创建一个新的变量。

function myFunc() {
console.log('running myFunc');
var i = 0;
console.log('assigning i to ' + i);
function increment() {
console.log('incrementing');
i++;
}
increment();
increment();
console.log(`calling myFunc ${i} times`);
}
myFunc();
myFunc();

现在,如果我们将i提升到myFunc的范围之上,我们将看到它的值在对myFunc的调用中保持在范围内。

var i = 0;
console.log('assigning i to ' + i);
function myFunc() {
console.log('running myFunc');
function increment() {
console.log('incrementing');
i++;
}
increment();
console.log(`calling myFunc ${i} times`);
}
myFunc();
myFunc();

适用于我。

var increment = (function() {
var i = 0;
return function() {
i++;
return i;
};
})();
console.log(increment());
console.log(increment());
console.log(increment());

最新更新