Skip to content

闭包

代码块

js
{
  // 使用在代码块外不可见的局部变量做一些工作

  let message = "Hello"; // 只在此代码块内可见

  alert(message); // Hello
}

alert(message); // Error: message is not defined

对于 if、for、while 等,在 括号内 声明的变量也仅在内部可见。

嵌套函数

函数里面,创建函数,第二个函数(里面的)就称为“嵌套”。

js
function makeCounter() {
  let count = 0;

  return function () {
    return count++;
  };
}
js
let counter = makeCounter();

counter(); // 0
counter(); // 1
counter(); // 2

counter 始终是一个,也就是说,他们的词法环境相同。

闭包

闭包 是指内部函数可以访问外部函数中声明的变量和参数。即使 外部函数 寿命终结 了。

在 JavaScript 中,所有函数都是天生闭包的(只有一个例外, "new Function")

JavaScript 中的函数会通过 [[Environment]] 属性记住创建它们的位置,所以它们都可以访问外部变量。

在面试时,前端开发者通常会被问到“什么是闭包?”,正确的回答应该是闭包的定义,并解释清楚为什么 JavaScript 中的所有函数都是闭包的,以及可能的关于 [[Environment]] 属性和词法环境原理的技术细节。