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