JS高程读书笔记——执行环境和作用域链
执行环境
执行环境定义了变量或函数有权访问的其他数据。
一个执行环境就是所有JS代码段执行时所在的环境。这个环境的一个重要的部分是定义变量的对象。所有JS函数都运行在自己独有的的执行环境中,而且具有自己的调用对象,在调用对象中定义了局部变量。
全局执行环境是最外层的执行环境,根据ECMAScript的宿主环境不同,表示的执行环境的对象也不一样。
每个函数都有自己的执行环境。JS的解释器每次开始执行一个函数时,都会为那个函数创建一个执行环境,这个函数的执行环境就被推入环境栈中,到函数执行完成后,栈将这个执行环境弹出,把控制权返回给之前的执行环境。
某个执行环境中的所有代码执行完毕后,该环境被销毁,保存在其中的所有变量和函数定义也随之销毁;全局执行环境直到应用程序退出——如关闭网页或浏览器——时才会被销毁。
作用域链
每个JS执行环境都有一个和它关联在一起的作用域链。这个作用域链是一个对象列表或对象链。
当代码在执行环境中执行时,会创建变量对象的一个作用域链。作用域链的用途是保证执行环境对有权访问的所有变量和函数的有序访问。
作用域链的前端始终都是当前代码所在的环境变量对象,逐级向上,一直延续到全局执行环境,全局执行环境始终都是作用域中最后一个对象。
标识符解析是沿着作用域链逐级搜索标识符的过程。搜索过程始终从作用域链的前端开始,逐级向后回溯,直到找到标识符为止。
作用域 Scope
Javascript 中的函数属于词法作用域,也就是说函数在它被定义时的作用域中运行而不是在被执行时的作用域内运行。这是犀牛书上的说法。但"定义时"和"执行(被调用)时"这两个东西有些人搞不清楚。简单来说,一个函数A在"定义时"就是 function A(){} 这个语句执行的时候就是定义这个函数的时候,而A被调用的时候是 A() 这个语句执行的时候。这两个概念一定要分清楚。
那词法作用域(以下称之为"作用域",除非特别指明)到底是什么呢?它是个抽象的概念,说白了它就是一个"范围",scope 在英文里就是范围的意思。一个函数的作用域是它被定义时它所处的"范围",也就是它外层的"范围",这个"范围"包含了外层的变量属性,这个"范围"被设置成这个函数的一个内部状态。一个全局函数被定义的时候,全局(这个函数的外层)的"范围"就被设置成这个全局函数的一个内部状态。一个嵌套函数被定义的时候,被嵌套函数(外层函数)的"范围"就被设置成这个嵌套函数的一个内部状态。这个"内部状态"实际上可以理解成作用域链。
照以上说法,一个函数的作用域是它被定义的时候所处的"范围",那么 Javascript 里的函数作用域是在函数被定义的时候就确定了,所以它是静态的作用域,词法作用域又称为静态作用域。

浙公网安备 33010602011771号