作用域和 this 一直是困扰我们大多数人的问题,这其中的规则初看时总觉得太过复杂,如果想要有更多更深的理解,就需要将此处的原理好好剖析开来,万物不离其原理,只有基础好了才能更进一步。
JavaScript 有一套对于变量进行存储和操作的规则,存储参照我的另一篇博客《JS数据类型及存储和判断方式》,而这个操作的规则就是作用域。
那什么是词法作用域呢?
这个在代码编译的时候就已经确定了。在这个阶段,会规定在作用域内对于变量的查找规则,我们称之为词法作用域,也称静态作用域。
而与之对应的是动态作用域。
静态作用域在代码编译的时候确认,动态作用域在代码执行的时候确定的。
JavaScript 使用的是静态作用域。
var value = 3;
function printValue() {
console.log(value)
}
function foo() {
var value = 4;
printValue();
}
foo();
按照我们前面提到的,JavaScript 使用的是静态作用域,所以在考虑这段代码的输出结果时,应该从静态作用域的角度去考虑。
- 执行 foo 函数。
- 在 foo 函数内部执行 printValue 函数。
- printValue 在自己内部没有 value 变量,于是按照词法作用域的规则,沿着被定义时的作用域链向上查找到全剧作用域内的 value。
- 打印3。
为了更清楚地认识到静态作用域和动态作用域的规则,我们再从动态作用域的角度去运行一下这段代码。
- 执行 foo 函数。
- 在 foo 函数内部执行 printValue 函数。
- printValue 在自己内部没有 value 变量,按照动态作用域在代码被执行时确定的规则,他被 foo 调用,于是沿着动态作用域在 foo 中找到value。
- 打印4。