Skip to content

作用域链 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函数内部变量

闭包是函数与声明该函数词法环境的组合