闭包

闭包

闭包概念:

  1. 闭包是函数在创建时形成的词法作用域绑定关系。
  2. 本质是函数对象内部持有对其创建时作用域的引用。
  3. 当函数在其定义作用域之外执行时,仍然可以访问当时的变量,这种机制就是闭包。

📍形成闭包的必要条件:

  1. 内部函数引用了外部变量
  2. 内部函数有没有活到外层函数结束之后
  3. 这个内部函数在外部仍然存在

📍 闭包什么时候产生?

函数创建时就产生闭包结构,但只有函数逃逸时才会保留环境。

词法作用域:

词法作用域(Lexical Scope)是指:变量的作用域在代码“写出来”的时候就已经确定了。

  • 词法作用域是指变量的作用域在代码定义阶段就已经确定,由函数的书写位置决定,而不是由调用位置决定。
  • JavaScript 是词法作用域语言,函数在创建时会记录其外部词法环境,变量查找沿着作用域链向外进行。

经典例子:log打印的是1,而不是2。 因为foo被定义在全局作用域,而不是定义在bar的作用域。

let a = 1;

function foo() {
  console.log(a);
}

function bar() {
  let a = 2;
  foo();
}

bar();