闭包
闭包概念:
- 闭包是函数在创建时形成的词法作用域绑定关系。
- 本质是函数对象内部持有对其创建时作用域的引用。
- 当函数在其定义作用域之外执行时,仍然可以访问当时的变量,这种机制就是闭包。
📍形成闭包的必要条件:
- 内部函数引用了外部变量
- 内部函数有没有活到外层函数结束之后
- 这个内部函数在外部仍然存在
📍 闭包什么时候产生?
函数创建时就产生闭包结构,但只有函数逃逸时才会保留环境。
词法作用域:
词法作用域(Lexical Scope)是指:变量的作用域在代码“写出来”的时候就已经确定了。
- 词法作用域是指变量的作用域在代码定义阶段就已经确定,由函数的书写位置决定,而不是由调用位置决定。
- JavaScript 是词法作用域语言,函数在创建时会记录其外部词法环境,变量查找沿着作用域链向外进行。
经典例子:log打印的是1,而不是2。 因为foo被定义在全局作用域,而不是定义在bar的作用域。
let a = 1;
function foo() {
console.log(a);
}
function bar() {
let a = 2;
foo();
}
bar();