作用域链 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
函数内部变量
闭包是函数与声明该函数词法环境的组合