作用域链 scope chain
javascript采用的是词法作用域,函数的作用域在函数定义的时候就决定了
例如下面这个foo函数,当在foo中找不到n时,会向上一层继续查找n这个变量。 这个过程称作为作用域链(scope chain)
js
var n = 2;
function foo(x){
let bar = x + n
return bar
}这个过程和原型链继承非常相似,但当你在原型链上查找一个不存在的属性时,会返回undefined,而你在作用域链上查找一个不存在的属性,会得到一个ReferenceError
js
window.x
// output: undefined
x
// Uncaught ReferenceError: x is not defined at <anonymous>:1:1闭包
定义在foo函数的方法,可以访问定义这个foo函数内部的变量
定义在foo函数外的方法,无法访问到foo函数内部变量
闭包是函数与声明该函数词法环境的组合