一个变量的作用域(scope)指的是程序源代码中定义这个变量的区域。
JavaScript只有两种作用域,全局作用域、函数作用域(ES6中新增了块级作用域)。
函数执行时所在的作用域,是定义时的作用域,而不是调用时所在的作用域。每一段JavaScript代码(全局代码或者函数)都有一个与之关联的作用域链(scope chain)。这个作用域链是一个对象列表或者链表,这组对象定义了这段代码“作用域中”的变量。当 JavaScript 需要查找变量 x 的值的时候(这个过程被称为“变量解析”(variable resolution)),它会从链中的第一个对象开始查找,如果这个对象有一个名为 x 的属性,则会直接使用这个属性的值,如果第一个对象中不存在名为 x 的属性,JavaScript 会继续查找链上的下一个对象,以此类推。如果作用域链上没有任何一个对象含有属性 x,那么就会抛出一个引用错误(ReferenceError)的异常。