编程语言几乎都有作用域这个功能,作用域是一套规则,用于在确定在何处以及如何查找变量。
作用域分词法作用域和动态作用域。
大多数语言采用的方式,如:Javascript。词法作用域在书写代码时就已经确定了变量的所处位置,取决于使用者将代码和块作用域写在哪决定。可以通过 Javascript 的 eval、with 欺骗词法作用域达到修改变量的目的。
词法作用域查找只会查找一级标识符,比如 a、b 和 c。如果代码中引用了 foo.bar.baz,词法作用域查找只会试图查找 foo 标识符,找到这个变量后,对象属性访问规则会分别接管对 bar 和 baz 属性的访问。
少数语言采用的方式,如 Bash 脚本、Perl 中的一些模式等。动态作用域在代码运行阶段确定。
假设 Javascript 是基于动态作用域,以下代码:
function foo() {
console.log( a ); // 3(不是 2 !)
}
function bar() {
var a = 3;
foo();
}
var a = 2;
bar();
结果输出3是因为动态作用域在代码运行时顺着调用栈查找变量,而不是基于作用域嵌套查找。