javascript执行环境(作用域)与作用域链深入剖析
js中执行环境和作用域链的地位在js中是相当重要的,也是编写复杂的js脚本所必需掌握于胸的知识,我们一起来揭开它的面纱,和大家共同来学习,在讲解的过程中可能会有疏忽的地方,希望读到的朋友指出。
执行环境:
它的原始定义是这样的:它定义了变量和函数有权访问的其它数据。看上去很抽象,其实很简单,举例来说,window对象中定义的变量和方法为全局的在全局范围中都能进行访问,那这就是全局(最外层)执行环境,当然一个函数也有执行环境;
深入理解执行环境:
1,执行环境中定义的变量和函数都保存在一个“变量对象中”,我们虽然编程不能访问到,但是在解析器处理数据时会在后台调用它;(这个特性非常重要:作用域链就是由这些变量对象组成的,由此我们就很容易理解了,一个执行环境中的数据也是通过它进行访问的);
2,执行环境分为局部执行环境(方法执行环境)和全局执行环境,局部执行环境在方法执行完毕后就被销毁了,它里面的所有数据也将被回收栈收回(如果遇到闭包那么情况会有所变化,这时就需要闭包销毁时才会被销毁);而全局的执行环境则是在窗口关闭时才会被销毁。
作用域:
作用域和执行环境其实是同一个概念但是这里我也给它一个定义:它是指对某一个变量或者函数有权访问的代码空间
作用域链:
作用域链是由一个个的变量对象所组成的,它的作用就是保证变量和函数的有序访问。
深入了解作用域链:
当一个函数被声明时它都会创建一个作用域链,此时的作用域链包含了它外层的变量对象它们被保存在[[Scope]]中,当函数被调用时为该函数创建执行环境(变量对象)和作用域链,在创建作用域链时先将先前的作用域链复制然后将自己的变量对象加在作用域链的前端。
项目经验:编写复杂的js脚本掌握这些知识非常的必要。