# 作用域链

# 作用域链

函数在创建的时候有一个内部属性 [[scope]] ,里面保存所有父变量对象到其中, [[scope]] 就是所有父变量对象的层级链,但是并不是完整的作用域链子。

在每个执行上下文的变量环境中, 会将活动对象添加到作用链的前端。

Scope = [当前函数作用域].concat([[scope]])

当一段代码使用了一个变量时,JavaScript 引擎首先会在“当前的执行上下文”中查找该变量。

如果在当前的变量环境中没有查找到,那么 JavaScript 引擎会继续在 outer 所指向的执行上下文中查找。

如果在 bar 函数或者 foo 函数中使用了外部变量,JavaScript 引擎会去全局执行上下文中查找。我们把这个查找的链条就称为作用域链。

foo 函数调用的 bar 函数,那为什么 bar 函数的外部引用是全局执行上下文,而不是 foo 函数的执行上下文?

这是因为词法作用域(看词法作用域章节)。