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
