0

例如,我有点困惑如何在 JavaScript 中完成词法作用域

function outer(){
    a = 5;
    function inner(){
        console.log(a);
        var a = 10;    //hoisting
    }
    inner();
}
outer();

如果我们a在第 5 行重新定义,那么它将打印undefined. 这是为什么?为什么解释器不向上遍历检查outer.VO,即使a可以在 中找到inner.VO,但它在定义之前就被使用了?

4

1 回答 1

3

据我记得,提升导致该inner功能被解释为:

function inner(){
    var a;
    console.log(a);
    a = 10;
}

因此,当您分配a给 10 时,它会查找范围,直到找到 的定义a,该定义位于函数var内部的语句中inner。它认为没有必要超出此范围,因此它的行为就像函数aouter不存在一样。此外,当var a;被执行时,默认a设置为undefined。这就是你看到undefined输出的原因。

我将对此进行更广泛的解释 Javascript 解释器在遇到函数(这称为执行上下文)时会执行以下操作

a: undefined 
inner : pointer to function

2-它定义了函数的范围链和'this'的值

B- 代码执行阶段 逐行执行代码

如果它遇到一个尚未声明的函数的调用,它将执行它记住

    inner : pointer to function

如果你在声明之前调用了 inner() ,没关系,但这不适用于匿名函数

因为它被视为任何变量

fn();
var fn = function () {..}

这行不通,因为它的变量对象将是那样的

fn: undefined 
于 2013-07-08T21:09:45.210 回答