作用域链就是将一个个作用域串起来,实现变量查找的路径。
作用域就是存放变量和函数的地方,全局环境有全局作用域,全局作用域中存放了全局变量和全局函数。每个函数也有自己的作用域,函数作用域中存放了函数中定义的变量。
下面这段程序,bar变量在本作用域中可以找到,所以直接输出;但是 type 输出是什么?type在foo函数中没有定义,但是在调用foo函数的bar函数和全局有定义,会输出什么呢?
var name = 'test'
var type = 'global'
function foo(){
var name = 'foo'
console.log(name)
console.log(type)
}
function bar(){
var name = 'bar'
var type = 'function'
foo()
}
bar()
因为JavaScript是基于词法作用域的,词法作用域就是指,查找作用域的顺序是按照函数定义时的位置来决定的。bar和foo函数的外部代码都是全局代码,所以无论你是在bar函数中查找变量,还是在foo函数中查找变量,其查找顺序都是按照当前函数作用域–>全局作用域这个路径来的。 所以,运行结果如下: