javascript执行上下文、作用域、闭包总结

1.执行上下文和变量对象

1)变量或函数的执行上下文决定了它们能够访问哪些数据,以及它们的行为。

2)每个执行上下文都有一个与之关联的变量对象(variable object),这个上下文中定义的所有变量和函数都存在于这个对象上,这个对象我们无法访问。

3)如果执行上下文是函数,那么它的活动对象(activation object)将作为变量对象,活动对象最初只有一个定义变量:arguments

2.上下文栈

1)上下文在其所有代码都执行完毕后会被销毁,包括定义在它上面的所有变量和函数。全局上下文只有在页面或程序关闭时才会被销毁。

2)当执行流达到函数时,该函数的上下文就会被压入上下文栈中,函数中调用另一个函数,那么另一个函数的上下文就会被继续压入栈中,函数执行完毕时,上下文栈就弹出该函数的上下文,将控制权返还给之前的上下文。

3.作用域和作用域链

1)上下文的代码在执行的时候,会创建变量对象的一个作用域链,这个作用域链决定了各级上下文中的代码在访问变量和函数时的顺序。

2)代码正在执行的上下文的变量对象始终位于作用域链的最前端。

3)作用域的第二个变量对象来自包含上下文(就是外面一层的上下文的变量对象),第三个变量对象再来自下一个包含上下文(就是外面两层的上下文的变量对象),以此类推直至全局上下文,故全局上下文的变量对象始终是作用域链中的最后一个变量对象。

4.闭包

1)函数在定义时,会为函数预装载当前上下文的作用域链到函数内部的[[Scope]]变量中。

2)当执行流执行到该函数时,会通过[[Scope]]里面的对象来创建该函数的作用域链。

3)紧接着创建该函数的变量对象并将其推到作用域链的最前端,这就是该函数的最终作用域链(不考虑作用域链增强)。

4)闭包的形成关键在第二步,返回的函数的[[Scope]]里面已经保存着对外部作用域链(就是五花八门的变量对象)的引用,那么外部的作用域链就被保存了下来(有引用,不会被垃圾回收器回收),而且函数内部还可以通过这个作用域链访问外部的变量和函数等。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值