美文网首页
JS中的闭包简洁理解 & 作用域链 & 变量对象

JS中的闭包简洁理解 & 作用域链 & 变量对象

作者: 寒枫Alex | 来源:发表于2017-05-07 04:43 被阅读0次

1. 定义

一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数), 因而这些
变量也是该表达式的一部分.

2. 简洁理解

  1. 一个函数定义在另一个函数内部
  2. 内部函数在执行时会通过复制它的[[scope]]属性创建作用域链
  3. 所以它会持外部父函数的变量对象的引用, 外部函数在执行完毕后不会马上释放变量对象的内存
  4. 因为作用域链上有外部函数等的变量对象, 所以常用于callback等用途
  5. 内部函数被调用时就会形成"闭包"

3. 深入理解

说到闭包, 就不得不提及变量对象和作用域链.

  1. 每个执行环境(既作用域)都有一个表示变量的对象—变量对象, 全局环境的变量对象始终存在, 局部环境的变量对象(如函数调用等), 则只在函数执行时存在.
  2. 再定义一个函数时, 会预先创建一个包含全局变量对象的作用域链, 保存在函数内部的[[scope]]属性中.
  3. 调用函数时, 会为函数创建一个执行环境, 通过复制函数的[[scope]]属性中的对象构建起执行环境的所需的新作用域链.
  4. 然后会有一个新的活动对象(即调用函数产生的变量对象)被创建并推入执行环境的作用域链的最前端.
  5. 作用域链本质上是一个指向变量对象的指针列表, 就是一个个指针从头到尾链了起来, 每个指针都指向一个变量对象.
  6. 无论什么时候在函数中访问一个变量, 都是从作用域链中搜索相应名字的变量.
  7. 一般来讲, 当函数执行完毕后, 局部活动对象就会被销毁, 内存中仅保存全局作用域, 但闭包不同, 因为闭包情况下, 外部函数的活动对象会被内部函数引用, 当内部函数的活动对象没被销毁时, 外部函数的活动对象是无法被释放的, 所以使用闭包时要注意内存泄露等问题.
  8. 当一个函数内部定义的子函数将会函数(即外部函数)的活动对象添加到他的作用域链中.
  9. 因为, 函数内部定义的匿名函数将会包含外部函数的活动对象, 即作用域链上有外部函数的变量对象, 从而实现了闭包. 因此外部函数不会在执行完后立即销毁活动对象, 因为内部的函数可能在引用. 只要内部函数执行完后, 才会执行销毁.

相关文章

  • JavaScript 函数闭包(colsure)

    理解闭包,你首先必须理解JS的变量作用域,JavaScript作用域和作用域链。 ES6之前,变量的作用域分为全局...

  • js函数中的this

    前两篇文章“执行环境和作用域”和“js中的闭包”,我对谈了执行环境、作用域、作用域链和闭包的理解。但当牵涉到对象中...

  • JS基础知识:变量对象、作用域链和闭包

    JS基础知识:变量对象、作用域链和闭包 前言:这段时间一直在消化作用域链和闭包的相关知识。之前看《JS高程》和一些...

  • JS 闭包(Closure)

    参考阮一峰老师的JS 闭包 理解闭包前需要理解变量作用域、变量提升 JS作用域 那如何让它依次打印,12345呢;...

  • JavaScript快速上手:关于闭包的知识分享

    JS中变量的作用域 在理解闭包之前,我们得弄清楚JS中变量的作用域原理,它分为全局作用域和局部作用域,它有一...

  • JS中的闭包简洁理解 & 作用域链 & 变量对象

    1. 定义 一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数), 因而这些变量也是该表达式的一部分....

  • JavaScript快速上手:关于闭包的知识分享

    01 JS中变量的作用域 在理解闭包之前,我们得弄清楚JS中变量的作用域原理,它分为全局作用域和局部作用域,它有一...

  • JS博客

    JS构造函数及new运算符 JS原型对象和原型链 函数作用域和作用域链 干货分享:让你分分钟学会JS闭包 深入理解...

  • 《Web前端开发之JavaScript精英课堂》(六)

    对 作用域、作用域链、执行上下文对象(GO | AO)、闭包 的个人理解: JS分为全局和局部作用域,都属于词法作...

  • 2018-07-11

    深入理解闭包: 一、变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域。 变量的作用域无非...

网友评论

      本文标题:JS中的闭包简洁理解 & 作用域链 & 变量对象

      本文链接:https://www.haomeiwen.com/subject/eoxutxtx.html