Javascript吊装 - David Shariff测验

时间:2014-09-29 21:17:55

标签: javascript

问题是,以下警告会是什么:

function bar() {
    return foo;
    foo = 10;
    function foo() {}
    var foo = '11';
}
alert(typeof bar());

答案是,功能。

我的问题:

  1. 不是bar()被其返回值替换?如果不是,为什么?
  2. 不是foo = 10;被提升到顶部? (吊装)

2 个答案:

答案 0 :(得分:6)

你可以这样看:

function bar() {
    var foo = function() {};
    return foo; // function ends here
    foo = 10;
    foo = '11';
}

其他两个作业陈述没有发生。

答案 1 :(得分:5)

JavaScript中只提升声明。

对于function声明,包括它们的整个语句体(在foo的情况下为空)。但是,对于var s,分配不被视为声明的一部分,并将保留在声明所在的位置。 (2)

对于引擎,bar()似乎是:

function bar() {
    // hoisted
    function foo() {}
    var foo;          // no-op, `foo` was already declared by `function foo() {}`

    // remaining statements
    return foo;

    // unreachable code following a `return`
    foo = 10;
    foo = '11'; // separated from `var foo;`
}

结果typeoffunction是指function foo() {}的类型,bar()返回的引用。 (1)

alert(bar().toString()); // "function foo() {}"