重学JavaScript(2) - 作用域

74 阅读1分钟

作用域:表示当前执行代码对变量的访问权限

作用域分为两种:

  1. 静态作用域(词法作用域):函数的作用域由函数定义时决定的,JavaScript就属于这一种。
  2. 动态作用域:函数的作用域由函数运行时决定的。

从下面例子可以看出区别:

var value = 1;

function foo() {
    console.log(value);
}

function bar() {
    var value = 2;
    foo();
}

bar();

// 结果是 ???

假定采用的是静态作用域,执行过程如下:

执行foo函数时,先查找函数内部有没有value变量,发现没有,就查找foo函数定义时的外层全局变量,发现有一个全局变量value = 1,所以打印出来1

假定采用的是动态作用域,执行过程如下:

执行foo函数时,先查找函数内部有没有value变量,发现没有,就查找foo函数运行时的外层bar函数,发现有一个局部变量value = 2,所以打印出来2

因为JavaScript是静态作用域,所以输出的结果是1。

参考

  1. JavaScript深入之词法作用域和动态作用域