词法(静态)做用域和动态做用域

参考文章:git

JavaScript深刻之词法做用域和动态做用域github

1.

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

2. 二者区别

由于 JavaScript 采用的是词法做用域,函数的做用域在函数定义的时候就决定了。函数

而与词法做用域相对的是动态做用域,函数的做用域是在函数调用的时候才决定的spa

例子:code

var value = 1;

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

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

bar();
复制代码

假设JavaScript采用静态做用域,让咱们分析下执行过程:ip

执行 foo 函数,先从 foo 函数内部查找是否有局部变量 value,若是没有,就根据书写的位置,查找上面一层的代码,也就是 value 等于 1,因此结果会打印 1。作用域

假设JavaScript采用动态做用域,让咱们分析下执行过程:get

执行 foo 函数,依然是从 foo 函数内部查找是否有局部变量 value。若是没有,就从调用函数的做用域,也就是 bar 函数内部查找 value 变量,因此结果会打印 2。it

前面咱们已经说了,JavaScript采用的是静态做用域,因此这个例子的结果是 1

相关文章
相关标签/搜索