作用域是什么?
作用域是指程序源代码中定义变量的区域。
作用域规定了如何查找变量,也就是确定当前执行代码对变量的访问权限。
ps:引用冴羽的blog -> (github.com/mqyqingfeng…)
词法作用域(静态作用域)
静态作用域又叫做词法作用域,采用词法作用域的变量叫词法变量。
词法变量有一个在编译时静态确定的作用域。
词法变量的作用域可以是一个函数或一段代码,该变量在这段代码区域内可见;在这段区域以外该变量不可见(或无法访问)。
词法作用域里,取变量的值时,会检查函数定义时的文本环境,捕捉函数定义时对该变量的绑定。
动态作用域
动态作用域的变量叫做动态变量。
只要程序正在执行定义了动态变量的代码段,那么在这段时间内,该变量一直存在;代码段执行结束,该变量便消失。
这意味着如果有个函数f,里面调用了函数g,那么在执行g的时候,f里的所有局部变量都会被g访问到。
而在静态作用域的情况下,g不能访问f的变量。
ps: 以上都引用自wiki -> (zh.wikipedia.org/wiki/作用域)
举个栗子:
var value = 1;
function foo() {
console.log(value);
}
function bar() {
var value = 2;
foo();
}
bar();//打印结果为 1
可以看到 foo调用时 向上查找value变量时并没有找到bar中的value,而是找到了Global中的value。
说明foo的上一层作用域是Global的 而不是 bar的。