var a = 'programmer'functionfoo() {
var b = 'iceman'
console.log(a); // programmer
console.log(b); // iceman
console.log(c); // c is not defined
}
foo()
var value = 1
functionfoo() {
console.log(value);
}
functionbar() {
var value = 2
foo()
}
bar() // 输出 1
如上:foo 作用域内没有定义 value 在它所定义的上级作用域里定义了一个 value,在 bar 环境内调用 foo,由于 JavaScript 采用的是词法作用域,也就是在定义时就确定了 作用域,所以 foo 会获取到 它的所定义位置的上一层作用域中的 value 而不是 bar 中的 value
而动态作用域就会与词法作用域相反,采用动态作用域的语言很少,如果是动态作用域,函数的作用域是由调用的时候确定的,就会输出 bar 内的 value