浅学一下JavaScript中的闭包函数

我相信大家都或多或少听过闭包函数,具体什么是闭包函数呢?

首先,我们先来看一段代码

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函数内部的属性

最后,期待疫情快快结束~~~

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值