Javascript范围链提升

时间:2013-07-08 21:06:45

标签: javascript lexical-scope hoisting

我很担心JavaScript中的词法范围是如何完成的,例如

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

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

1 个答案:

答案 0 :(得分:3)

从我记忆中,提升导致inner函数被解释为:

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

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

我会解释一下这个问题 Javascript解释器在遇到函数时执行以下操作(这称为执行上下文) A-创作阶段 1-第一步它创建了一个名为变量对象的不可访问的对象,它看起来就像你的外部函数

a: undefined 
inner : pointer to function

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

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

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

    inner : pointer to function

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

因为它被视为任何变量

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

这不起作用,因为它的变量对象就是那个

fn: undefined