391 字
2 分钟
js的静态作用域理解

js的静态作用域理解#

总所周知,js是词法作用域(静态作用域),函数的作用域在函数定义的时候就已经决定了。(这句话是重点,要考)

作用域#

作用域是指程序源代码中定义变量的区域

作用域规定了如何查找变量,也就是确定当前执行代码对变量的访问权限。

JavaScript 采用词法作用域(lexical scoping),也就是静态作用域。

按题分析#

如下

var value = 0;
function sayHi(){
console.log(value);
}
function hi(){
const value = 2;
sayHi();
}
hi();

最终打印啥?

就是

2

错!

是1哈哈哈哈哈

为啥卧槽

执行过程#

  1. 首先可以看到全局定义了value, 声明了函数hi和sayHi
  2. 这时候是最外层声明的函数,那么sayHi和hi的函数作用域在此时已经决定了!(作用域是一层层的嵌套的,具体这里内部处理方式看 js的作用域链那片文章
  3. 这时候执行hi函数
  4. 定义了一个value,然后什么都不做去执行sayHi
  5. 这时候执行sayHi函数,要输出value,这时候会去查找他的局部是否有这个变量,发现没有
  6. 这个时候往上找,这个上,很重要,就是sayHi函数在定义的时候的那个区域,这里指的就是全局
  7. 全局找到了value,输出value

如果说是动态作用域的话,那这里执行sayHi就得看调用它是在哪个域中调用了

js的静态作用域理解
https://nollieleo.github.io/posts/js的静态作用域/
作者
翁先森
发布于
2021-06-05
许可协议
CC BY-NC-SA 4.0