我对于闭包的浅显理解
// demo1
function foo(){
var a = 1
function bar(){
console.log(a)
}
return bar
}
var baz = foo()
baz() // 1
在这个例子中,我们希望foo()执行完毕之后就销毁掉,但是由于我们将bar的引用return出去了,它就拥有了对foo()内部作用域的闭包,让该作用域一直存活,以供bar()在之后任何时间进行引用。
所以bar()依然持有对该作用域的引用,这个引用就叫做闭包。
无论使用什么方式对函数类型的值进行传递,当函数在别处被调用时都可以观察到闭包的产生
// demo2
function foo(){
var a = 1
function inside(){
console.log(a)
}
out(inside)
}
function out(fn){
fn() // 形成闭包
}
foo()
把内部函数inside传递给out,当调用这个内部函数的时候,它涵盖的foo()内部作用域的闭包就可以观察到,因为它能够访问到变量a
间接传递函数也是可以触发闭包
// demo3
var fn
function foo(){
var a = 1
function inside(){
console.log(a)
}
fn = inside // 将inside分配给全局变量
}
function outside(){
fn() // 形成闭包
}
foo()
outside()