Javascript执行环境、作用域链

时间:2022-09-27 21:38:20

执行环境

可以把执行环境想象为一个圆圈,里面包含了一些变量、函数。

执行环境定义了变量或函数的有权访问的其他数据,决定了它们各自的行为。还有一个顶部执行环境。在浏览器中,顶部执行环境既为window,它在关闭浏览器过后会销毁此执行环境。

变量对象

可以把变量对象想象为圆圈的管家,它管理着当前执行环境里所有的变量和函数。

每一个执行环境都有一个变量对象,执行环境中所有的变量和函数都保存在这个变量对象中,但是这个变量对象我们无法通过代码进行访问。

环境栈

可以把环境栈想象成用于装置当前需要载入的执行环境的容器。

通过环境栈来控制执行环境的顺序,每进入一个新的执行环境,之前的执行环境将被挂载,而新的执行环境将被推入环境栈。当这个新的执行环境执行完之后,环境栈将当前已执行完的执行环境弹出并将控制权交回给之前被挂载的执行环境。以此继续执行,直到到达顶部执行环境。

作用域链

可以把作用域链想象成链接各个执行环境的一根线。

作用域链的作用保证了执行环境有权访问的变量、函数有序的访问,作用域链连接着当前执行环境以及当前执行环境之前被挂载的执行环境,一直以此方式直到顶部执行环境。

活动对象

如果执行环境是函数,那么执行环境的变量对象即为活动对象(argument对象),函数所有的参数均是argument对象的属性。

标识符解析

当在执行环境中使用某一个变量的时候,通过标识符来表示此变量,在使用标识符的时候,后台进行了一系列的查询,这个查询是依据作用域链来进行查询,首先查询作用域链当前的执行环境的变量对象是否包含此变量,如果没有则进行根据作用域链向上继续查询,直到顶部作用域链。在之间任何一个执行环境的变量对象中查询到则停止查询。如果没有查找出来则抛出错误。