JavaScript 闭包
当函数可以记住并访问所在的词法作用域时,就产生了闭包,即使函数是在当前词法作用域之外执行。
比如如下代码:
function foo() {
var a = 2
function bar() {
console.log(a);
}
return bar
}
var baz = foo()
baz() // 2
foo()执行完,闭包阻止了垃圾回收,内部作用域仍然存在,传递给baz之后调用仍然可以访问到。
不一定通过return
将内部的函数传递出去才会产生闭包,其实无论通过何种手段将内部函数传递到所在的词法作用域之外,都会产生闭包,持有原始作用域的引用。正如下面这个例子:
var a = 0
var b = 0
function A(a) {
A = (b) => {
console.log(a + b++);
}
console.log(a++);
}
A(1)
A(2)
console.log(a,b);
// 1 4 0,0
该例子中将A函数重新赋值,同样也产生了闭包,导致执行A(2)的时候仍保存作用域a=2,因此输出为4。