JS之执行环境以及作用域

1、执行环境定义了变量或函数有权访问的其他数据,决定了它们各自的行为。

每个执行环境中都有一个与之关联的变量对象(我们编写的代码无法访问它,但解析器会在处理数据时在后台使用它。在执行环境内定义的所有变量和函数都保存在这个对象中)。

web浏览器中,把window对象作为其全局执行环境(全局执行环境是最外围的一个执行环境),则此时在全局条件下定义的所有函数和变量都作为window的属性和方法。

某个执行环境中的所有代码执行完毕后,则该执行环境销毁,保存在其中的所有变量和函数定义也随之销毁。全局执行环境则在应用程序退出后销毁。

每个函数都会有自己的执行环境,当代码执行到该函数,则其执行环境会被推入一个环境栈中。在函数执行完毕后,栈将其环境弹出,把控制权返回给之前的执行环境。

当代码在一个执行环境中执行时,会创建变量对象的一个作用域链。

2、作用域链保证对执行环境有权访问的所有变量和函数的有序访问。作用域的前端,则始终都是当前执行的代码所在环境的变量对象。函数中则将其活动对象作为变量对象。

活动对象中最开始只包含一个变量,即arguments对象(全局环境中不存在)。作用域链中的下一个变量对象来自其包含环境,再下一个变量对象则来自下一个包含环境,以此类推直到全局环境。

全局执行环境始终的变量对象始终都是作用域链中的最后一个对象。

标识符解析是沿着作用域链一级一级地搜索标识符的过程。搜索过程始终是从作用域链的最前端开始,然后逐级向后搜索,直到找到标识符为止,找不到通常会导致错误。

内部环境可以通过作用域链访问所有的外部环境,外部环境不能访问内部环境的任何变量和函数。

3、延长作用域链

以下两个语句都会在作用域链的前端添加一个变量对象。

try-catch语句中的catch块:通过创建一个新的变量对象,其中包含的是被抛出的错误对象的声明。

with语句:将指定的对象添加到作用域链前端。

4、没有块级作用域

你可能感兴趣的:(JS之执行环境以及作用域)