Skip to content

2. JS词法作用域和动态作用域

Ned2017 edited this page Dec 4, 2020 · 1 revision

https://github.com/mqyqingfeng/Blog/issues/3

JS采用的是词法作用域,即静态作用域。也就是说函数的作用域在函数定义的时候就决定了。

作用域规定了作用域链的顺序。

https://owen027.github.io/2019/06/27/closure/

静态作用域

.静态作用域又叫做词法作用域,采用词法作用域的变量叫词法变量。词法变量有一个在编译时静态确定的作用域。(JavaScript 采用的是词法作用域) 词法变量的作用域可以是一个函数或一段代码,该变量在这段代码区域内可见(visibility);在这段区域以外该变量不可见(或无法访问)。词法作用域里,取变量的值时,会检查函数定义时的文本环境,捕捉函数定义时对该变量的绑定。

动态作用域

.动态作用域的变量叫做动态变量。程序正在执行定义了动态变量的代码段,那么在这段时间内,该变量一直存在;代码段执行结束,该变量便消失。(函数的作用域在函数调用时才决定。)动态作用域里,取变量的值时,会由内向外逐层检查函数的调用链,并打印第一次遇到的那个绑定的值。显然,最外层的绑定即是全局状态下的那个值。

动态作用域只有在函数或代码块执行时其内部的变量才会存在,执行结束后变量便会消失。而词法作用域中的变量在编译时静态确定变量的作用域,它会一直存在,并且只用在作用域中才能访问。从技术的角度来说,在JS中所有的函数都是闭包。