JavaScript中的词法作用域

365 阅读1分钟

JavaScript 函数的作用域在函数定义的时候就决定了

理解下面这句话,你就理解了词法作用域:

JavaScript 函数的作用域在函数定义的时候就决定了。

var name = 'mango';

function getName() {
    return name;
}

function changeName() {
    var name = 'apple';
    return getName();
}

changeName();

这段代码会返回什么? 答案是'mango'。

JavaScript 函数的执行的作用域链是在函数定义的时候创建的。执行 getName() 时,其中的变量 name 在函数内部没有,就在其定义的地方往作用域链上层寻找变量name('mango'),那么不管何时何地执行函数 getName(),这种绑定在执行 getName() 时始终有效。

词法作用域与闭包

为了去实现这种词法作用域,JavaScript函数对象的内部状态不仅包含函数逻辑的代码,除此之外还包含当前作用域链的引用。函数对象可以通过这个作用域链相互关联起来,如此,函数体内部的变量都可以保存在函数的作用域内,称之为闭包。

思考

最后,让我们看一个《JavaScript权威指南》中的例子:

var scope = "global scope";
function checkscope(){
    var scope = "local scope";
    function f(){
        return scope;
    }
    return f();
}
checkscope();
var scope = "global scope";
function checkscope(){
    var scope = "local scope";
    function f(){
        return scope;
    }
    return f;
}
checkscope()();

做个笔记,读冴羽大佬的博客有感。原文可点击。