谈谈你对作用域链的理解

我们来看一个例子:

var foo = 1; // Env3(注:Env表示作用域)

function onload() {
  var bar = 2; // Env2
  return function callback() {
    var baz = 3; // Env1
    return foo + bar + baz;
  };
}

上面代码中,我们定义了三个作用域:Env1Env2Env3

当计算foo + bar + baz的时候,需要依次从下往上搜索作用域内是否有对应的变量声明。

首先,在Env1中查找foo,不存在,向上在Env2中查找,也不存在,再往上,直到在Env3中找到,取其值。

其次,在Env1中查找bar,不存在,向上在Env2中找到,取其值。

最后,在Env1中找到baz,取其值。

Env1Env2Env3这三个作用域是存在关系的,Env1 的 OuterEnv 是 Env2,Env2 的 OuterEnv 是 Env3,这条关系链称为作用域链