我相信大家都或多或少听过闭包函数,具体什么是闭包函数呢?
首先,我们先来看一段代码
var gloab
var a(){
var aa = 123
function b(){
var bb = 234
console.log(aa)
}
return b
}
var res = a()
res()
我们先来大胆做一下预测,这段代码执行的结果是 undefined还是123呢?想知道具体结果,我们耐着性子往下看(心急吃不了热豆腐)
想要完全搞清除闭包产生的原因,我们要先了解一个概念js的作用域特性
那么什么是js的作用域特性呢
JavaScript在拿到一段代码的时候,首先会进行预编译,在这个预编译的过程中就会产生两个对象,分别是 函数产生的预编译AO对象和 全局代码执行期间产生的GO对象
接下来,我们继续解释上面这段代码,首先在执行var res 这个代码的时候,首先会产生全局GO对象
GO{
gloab: undefined
res: undefined
}
在执行res = a()的时候,GO对象发生了更新,与此同时产生了AO对象
GO{
gloab: undefined
res: [Function a]
}
[a函数的AO对象]
AO{
aa: undefined
b : [Function b]
}
当b函数定义的时候,它所能看到的是上面的AO和GO对象【也就是说:b函数是站在a函数的肩膀上看世界的】,接下来代码接着往下执行,随着b函数的定义,会产生b函数自己的AO对象
【b函数的AO对象】
AO{
bb: undefined 234
}
除了这个AO对象,上面说到,b函数还能看到a函数的AO对象,全局的GO对象
当执行到res()函数的时候,a函数的返回值也就是b函数,所以res() 也就相当于执行了a函数中定义的b函数
此时b函数中所输出的aa 也就是a函数预编译中产生的AO对象中的aa,也就是123
看到这里,我相信大家懂了闭包函数的产生原因
闭包函数是由于js的作用域特性导致的,虽然b函数是在外部执行的,但还是可以访问到a函数内部的属性
最后,期待疫情快快结束~~~