Javascript吊装 - David Shariff测验

Geo*_*nos 0 javascript

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

function bar() {
    return foo;
    foo = 10;
    function foo() {}
    var foo = '11';
}
alert(typeof bar());
Run Code Online (Sandbox Code Playgroud)

答案是,功能.

我的问题:

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

Dav*_*ret 6

你可以这样看待它:

function bar() {
    var foo = function() {};
    return foo; // function ends here
    foo = 10;
    foo = '11';
}
Run Code Online (Sandbox Code Playgroud)

其他两个赋值语句没有发生.


Jon*_*ski 5

只有声明在JavaScript中提升.

对于function声明,包括它们的整个语句体(在其情况下为空foo).但是,对于vars,分配不被视为声明的一部分,并将保留在声明的位置.(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;`
}
Run Code Online (Sandbox Code Playgroud)

将所得typeof的存在function指的是的类型function foo() {},提及这就是bar()返回.(1)

alert(bar().toString()); // "function foo() {}"
Run Code Online (Sandbox Code Playgroud)