当在循环中设置函数并返回值时,如果返回的是循环变量的值,那么每次迭代都会更新这个变量,最终返回的是最后一个循环的值。为了解决这个问题,你可以使用闭包(closure)来捕获每次循环的变量值。
以下是一个使用 JavaScript 的示例:
function createFunctions() {
let result = [];
for (let i = 0; i < 3; i++) {
result.push((function(value) {
return function() {
return value;
};
})(i));
}
return result;
}
const functions = createFunctions();
console.log(functions[0]()); // 输出 0
console.log(functions[1]()); // 输出 1
console.log(functions[2]()); // 输出 2
在这个示例中,我们使用了一个立即执行的函数表达式(IIFE)来创建一个新的作用域,并将循环变量 i
作为参数传递给它。这样,每次循环都会创建一个新的作用域,捕获当前循环变量的值。因此,当我们调用 functions
数组中的函数时,它们会返回各自的值,而不是最后一个循环的值。
如果你使用的是 ES6 或更高版本的 JavaScript,你可以使用 let
关键字来声明循环变量,这样每次迭代都会创建一个新的块级作用域,从而避免这个问题:
function createFunctions() {
let result = [];
for (let i = 0; i < 3; i++) {
result.push(function() {
return i;
});
}
return result;
}
const functions = createFunctions();
console.log(functions[0]()); // 输出 0
console.log(functions[1]()); // 输出 1
console.log(functions[2]()); // 输出 2
在这个示例中,我们使用了 let
关键字来声明循环变量 i
,这样每次迭代都会创建一个新的块级作用域,从而避免了返回最后一个循环值的问题。
领取专属 10元无门槛券
手把手带您无忧上云