词法作用域 VS 动态作用域
彻底搞懂JavaScript作用域里介绍过,大部分标准语言编译器的第一个工作阶段叫作词法化(也叫单词化)。回忆一下,词法化的过程会对源代码中的字符进行检查,如果是有状态的解析过程,还会赋予单词语义。
在JS里,使用的作用域就是词法作用域。
简单地说,词法作用域就是定义在词法阶段的作用域。换句话说,词法作用域是由你在写代码时将变量和块作用域写在哪里来决定的,因此当词法分析器处理代码时会保持作用域不变(大部分情况下是这样的)。
在JS里,动态作用域和this机制息息相关。它的作用域诗是在运行的过程中确定的
var a = 1;
function foo() {
var a = 2;
console.log( this.a );
}
foo(); // 1
从上面的代码,我们可以看出:foo中打印a的值不是由写代码的位置确定的,而是取决于foo执行的位置。
区别
词法作用域是在写代码或者说定义时确定的,而动态作用域是在运行时确定的。(this 也是!)
词法作用域关注函数在何处声明,而动态作用域关注函数从何处调用。
彻底搞懂JavaScript作用域里介绍过,大部分标准语言编译器的第一个工作阶段叫作词法化(也叫单词化)。回忆一下,词法化的过程会对源代码中的字符进行检查,如果是有状态的解析过程,还会赋予单词语义。
在JS里,使用的作用域就是词法作用域。
简单地说,词法作用域就是定义在词法阶段的作用域。换句话说,词法作用域是由你在写代码时将变量和块作用域写在哪里来决定的,因此当词法分析器处理代码时会保持作用域不变(大部分情况下是这样的)。
在JS里,动态作用域和this机制息息相关。它的作用域诗是在运行的过程中确定的
var a = 1;
function foo() {
var a = 2;
console.log( this.a );
}
foo(); // 1
从上面的代码,我们可以看出:foo中打印a的值不是由写代码的位置确定的,而是取决于foo执行的位置。
区别
词法作用域是在写代码或者说定义时确定的,而动态作用域是在运行时确定的。(this 也是!)
词法作用域关注函数在何处声明,而动态作用域关注函数从何处调用。

