【深入JavaScript】闭包

本文深入探讨JavaScript中的闭包,解释其定义、作用域链原理,并通过实例解析闭包如何保留外部函数作用域的变量。同时,文章讨论了闭包中的this和arguments问题,以及闭包可能带来的性能影响和最佳实践。
摘要由CSDN通过智能技术生成

定义

《JavaScript高级程序设计》对闭包的定义:

闭包指那些引用了另一个函数作用域中变量的函数,通常是在嵌套函数中实现的。

e.g.:

function foo () {
   
  a = 1
  return function () {
   
    console.log(a)
  }
}

var bar = foo()
bar()  // 1

思考

Q1:我们知道,当调用闭包的外部函数的时候,在函数执行结束之后,函数的执行上下文就会退出执行上下文栈,活动对象的也会被销毁。那为什么在外部函数被调用之后,再调用闭包的内部函数的时候还能够访问外部函数中的变量呢?例如,在上面例子中, var bar = foo() 执行结束之后,foo() 的变量对象已经被销毁了,为什么 bar() 执行的时候还能够访问到 foo() 中的变量 a 呢?

A1:这是因为作用域链的存在。回想一下一个函数从创建到执行的过程

  1. 函数声明后,设置函数的 [[scope]] 内部属性,其中包含了该函数各级父级执行上下文的变量对象

  2. 函数被调用之后,创建一个执行上下文,并将这个执行上下文压入执行上下文栈中

  3. 复制函数的 [[scope]] 内部属性,创建作用域链

  4. 通过 arguments 创建活动对象并初始化

  5. 将活动对象添加到作用域链最前端

  6. 准备工作完成,执行函数

  7. 函数执行完毕,执行上下文出栈,销毁活动对象

    ​ 从函数创建到执行的整个过程中,我们注意到&#

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zeekCheung

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值