我们来看一个例子:
var foo = 1; // Env3(注:Env表示作用域) function onload() { var bar = 2; // Env2 return function callback() { var baz = 3; // Env1 return foo + bar + baz; }; }
上面代码中,我们定义了三个作用域:Env1
、Env2
、Env3
。
当计算foo + bar + baz
的时候,需要依次从下往上
搜索作用域内是否有对应的变量声明。
首先,在Env1
中查找foo
,不存在,向上在Env2
中查找,也不存在,再往上,直到在Env3
中找到,取其值。
其次,在Env1
中查找bar
,不存在,向上在Env2
中找到,取其值。
最后,在Env1
中找到baz
,取其值。
Env1
、Env2
、Env3
这三个作用域是存在关系的,Env1 的 OuterEnv 是 Env2,Env2 的 OuterEnv 是 Env3,这条关系链称为作用域链
。