89.闭包与变量作用域

书诚小驿2025/07/08前端面经算法Javascript

题目描述 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
最后更新时间' 2025/7/9 01:40:10