JavaScript 做用域 与 做用域链

  本文是参照高程(JavaScript 高级程序设计)加上一些我的的理解和总结,使用简单的小例子和一些代码片断来尽可能解释清楚做用域和做用域链。(本文适用于具有一些JS基础的朋友拿来参考)html

执行环境与 函数的定义和执行

  执行环境定义了变量或者函数有访问其余数据的权限 。在 JavaScript 中,有一个最外层的全局执行环境,在Web浏览器中,一般咱们认为就是window这个对象。
  经过一个小例子来解释一下在定义函数和执行函数分别发生了哪些事情。
  从这张图中,咱们能看出,当咱们定义了一个函数 test1 时,
    一、首先在堆内存中建立了一个Function对象,而后将地址存在 test1 中;
    二、自动建立一个对象,而且该对象有一个 constructor 属性指向该函数自己,最后该函数对象的prototype属性指向这个对象;
    三、将包括全局对象在内的,在函数执行过程当中建立的活动对象(后文解释)都存在该函数自身的内部属性[[Scope]]上。浏览器

  当执行一个函数(test1)时,
    一、首先会建立一个执行环境ECS及相应的做用域链;
    二、而后使用arguments和函数的参数(若是有)的值来初始化函数的活动对象(Active Object)也就是上面所说的活动对象;
    其中,该函数对应的做用域链是经过取出[[Scope]]的值,而且将当前函数的活动对象推入做用域链的最顶层。闭包

  以上咱们简单的说了一下函数定义和执行,这样有助于咱们理解做用域链以及我博客中的 闭包 和 以及 如何解释let在for循环中的特殊表现。函数

相关文章
相关标签/搜索