javascript执行环境以及作用域链的自己的一些理解
javascript执行环境以及作用域链的自己的一些理解
js的作用域链是一个很重要的概念,如果理解了它,可能会让自己对于js的运行机制有一个更好的理解,因为自己也是一个初学者,所以希望通过这样的形式记录下来,让自己记忆更加深刻。以是自己对于js作用域的一些理解:
A.首先是js的执行环境,也可以叫做执行上下文,一般称为环境就行。并且在js中,有一个一直都存在的环境(执行环境),那就是全局执行环境,也就是window对象,只有当结束全部程序或者是关闭网页或是浏览器时,那这个全局执行环境才会被销毁。而其他的环境则是存放在一个环境栈当中。而如果要把一个环境存入环境栈中的话,举一个例子就相当于:js执行到哪一个函数的时候,那么js就会把这个函数的执行环境加入到环境栈中,在当函数执行完毕之后,那么js再把这一个函数的环境从环境栈中拿出来。
B.其次就是js的作用域链,先说重要的一点:每一个执行环境都会有一个对应的变量对象,变量对象简单来理解就是在环境中被定义的变量,函数等等一系列数据;再说作用域链:每当创建一个函数的时候,那么js会自己为这个函数创建一个预先包含全局变量对象的作用域链,然后把这个作用域链保存在内部的[[Scope]]属性中,当这个函数被调用的时候,首先就会将这个函数的执行环境添加到环境栈中,,然后通过复制函数的[[Scope]]属性中的对 象就可以构建起执行环境的作用域链;
C.所以照我的理解,一个函数只要已创建出来之后,那么这个函数的作用域链其实就已经会被确定下来,不管在哪个位置去执行这个函数的时候,那当函数的执行环境被加入到环境栈中时,那么它就会去复制原本已经确定的作用域链来完成所需各种数据的查找