在创建闭包时,确保正确地引用外部变量。
例如,在以下代码中,我们希望在调用printCounter
函数时,累加器的值加一。但是,由于我们没有正确地引用变量counter
,每次调用printCounter
时,都会输出值为1的累加器,而不是预期的输出不同的累加器值。
function createCounter() {
var counter = 0;
return function printCounter() {
console.log(counter++);
}
}
var c1 = createCounter();
c1(); // 输出 1
c1(); // 输出 2
c1(); // 输出 3
var c2 = createCounter();
c2(); // 输出 1 (而不是预期的输出 1)
为了解决这个问题,我们可以将闭包函数中的 counter
变量替换为从外部作用域引用的 counter
变量。这由JavaScript的变量作用域和闭包概念中所谓的“变量提升”机制实现。
修改后的代码如下:
function createCounter() {
var counter = 0;
return function printCounter() {
console.log(counter++);
}
}
var c1 = createCounter();
c1(); // 输出 1
c1(); // 输出 2
c1(); // 输出 3
var c2 = createCounter();
c2(); // 输出 1 (正确地输出了不同的累加器值)