89.闭包与变量作用域
题目描述 1
function createFunctions() {
var result = [];
for (let i = 0; i < 5; i++) {
// 使用let创建块级作用域
result.push(function () {
return i; // 每个i都是独立的
});
}
return result;
}
var functions = createFunctions();
// 以下调用会输出什么?
console.log(functions[0]()); // 0
console.log(functions[1]()); // 1
console.log(functions[2]()); // 2
console.log(functions[3]()); // 3
console.log(functions[4]()); // 4
错误回答
0 1 2 3 4
参考答案
DETAILS
5 5 5 5 5
题目描述 2
function createFunctions() {
var result = [];
for (let i = 0; i < 5; i++) {
// 使用let创建块级作用域
result.push(function () {
return i; // 每个i都是独立的
});
}
return result;
}
var functions = createFunctions();
// 以下调用会输出什么?
console.log(functions[0]());
console.log(functions[1]());
console.log(functions[2]());
console.log(functions[3]());
console.log(functions[4]());
参考答案
DETAILS
var 的函数作用域:
var i 的作用域是整个 createFunctions() 函数,而不是循环块
循环结束后,i 的值为 5(当 i=4 时满足条件,执行循环体后 i++ 变为 5,然后不满足 i<5 退出循环)
闭包特性:
所有函数都共享同一个变量 i
当调用这些函数时,它们访问的是最终的 i 值(5)
函数在定义时没有捕获当前 i 的值,而是保留了对变量 i 的引用
0 1 2 3 4