静态作用域:函数声明的时候就已经确定作用域。
动态作用域:函数调用的时候确定作用域。
js采用的是静态作用域,也称词法作用域。
var a = 1;
function func() {
console.log(a)
}
function func2() {
var a = 2;
func();
}
func2();
// 打印 1
func2 被调用,func2 中的 func 被调用,执行 console.log(),在 func 函数中未找到变量 a,于是去查找外层作用域,由于 js 是静态作用域,func 是在全局作用域中定义的,所以会去全局作用域查找变量,于是打印1。
var a = 1;
function func2() {
var a = 2;
function func() {
console.log(a)
}
func()
}
func2();
// 打印 2
因为 func 是在 func2 中被定义,当在 func 中未找到变量a,于是去外层 func2 中查找,找到变量a = 2,打印2,执行完成。