作用域闭包
闭包
wiki 上对闭包的定义:
闭包(英语:Closure),又称词法闭包(Lexical Closure)或函数闭包(function closures),是引用了自由变量的函数。这个被引用的自由变量将和这个函数一同存在,即使已经离开了创造它的环境也不例外。所以,有另一种说法认为闭包是由函数和与其相关的引用环境组合而成的实体。
自由变量的定义:在 fn() 作用域中使用的变量 x,却没有在 fn() 作用域中声明(即在其他作用域中声明的),对于 foo() 作用域来说,x 就是一个自由变量。
当函数可以记住并访问所在的词法作用域时,就产生了闭包,即使函数是在自己定义的词法作用域以外的地方执行。
闭包使得函数在定义时的词法作用域以外的地方被调用时,函数可以继续访问定义时的词法作用域。
在 JavaScript 中有垃圾回收器用来释放不再使用的内存空间,通过使用闭包可以阻止这件事情的发生,使得这个函数的内部作用域一直存活。
在函数 foo() 内部定义了函数 func(), func() 引用了其父函数作用域的变量,对这个内部作用域的引用就叫作闭包。
function foo() {
let a = 0;
return function func() {
console.log(a);
a++;
};
}
const bar = foo();
const baz = foo();
bar(); // 0
bar(); // 1 闭包保存上次计算的值
bar(); // 2
baz(); // 0 新生成函数
将 foo() 内部定义的func() 函数作为一个参数,传递给在全局作用域下定义的 bar() 函数,从而达到访问 func() 词法作用域的目的。
无论通过何种手段将内部函数传递到所在的词法作用域以外,它都会持有对原始定义作用域的引用,无论在何处执行这个函数都会使用闭包。
The MIT License (MIT)
Copyright (c) 2019, Roojay.
本文链接:https://roojay.com/pages/78f2b66e/