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哈哈哈哈哈
为啥卧槽
执行过程
- 首先可以看到全局定义了value, 声明了函数hi和sayHi
- 这时候是最外层声明的函数,那么sayHi和hi的函数作用域在此时已经决定了!(作用域是一层层的嵌套的,具体这里内部处理方式看 js的作用域链那片文章
- 这时候执行hi函数
- 定义了一个value,然后什么都不做去执行sayHi
- 这时候执行sayHi函数,要输出value,这时候会去查找他的局部是否有这个变量,发现没有
- 这个时候往上找,这个上,很重要,就是sayHi函数在定义的时候的那个区域,这里指的就是全局
- 全局找到了value,输出value
如果说是动态作用域的话,那这里执行sayHi就得看调用它是在哪个域中调用了