1、这家伙到底是什么?
网上关于这个的讨论的太多了太多了,有各种的举例子,但是大部分还在寻找这个答案的小伙伴对于变量解析,作用域链等相关概念-并不是那么了解,所以看得云里雾里。
先把结论放出来:就是一种允许函数向关联的父级作用域寻址的访问特权
,下面一步步解释
有人说:闭包不就是函数内部返回一个函数?真的就只是这样?
下面大家看看这个东西?
var a = 1
var b = function(){
var temp = 2
return function(){
console.log(temp)
console.log(a)
}
}
var c = b()
c() // 打印 2 1
我们来看看这个c
到底是什么?
没有对比,我还是看不懂!这里,我删除console.log(temp)
试试
这个时候,你再翻译closure
试试,没错!它丫的就叫闭包
,通过对比上面两张图,我写了一句console.log(temp)
就多出了一个closure
,那为什么呢?
2、闭包的产生
其实console.log(temp)
换句话说,我需要temp
这个家伙来用于未来
打印,请注意在执行后var c = b()
,如果没产生闭包对temp产生引用,temp会被垃圾回收机制clear掉。所以,既然我要用,我就用closure
把你存起来,这个时候,闭包也就产生了!
这里就包含一个开始说到的概念:作用域链scope chain
3、作用域链
我们接着上面的例子来看
var a = 1
var b = function (){
var b1 = 2
return function(){
var b2 = 3
console.log(b1)
return function(){
console.log(b2)
}
}
}
var c = b()
var d = c()
我们来看看,这个多层闭包嵌套后,小家伙到底是什么?
我们可以看到,它是一层一层往上建立closure
,最顶层是Global
,
特别注意
如果父函数产生了闭包,那么子函数不管是否产生闭包,都将继承闭包。
谢谢大家,欢迎指正。
网友评论