2014-09-29 4 views
0

질문은, 다음과 같은 경고 무슨 :자바 스크립트 리프팅 - 데이비드 Shariff 퀴즈

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

과 대답은, 기능.

내 질문 :

  1. 바 아닌가는()의 반환 값으로 대체? 그렇지 않다면, 왜?
  2. foo = 10이 아님; 꼭대기에 올라가고 있니? 다른 두 할당 문은 발생되지 않습니다

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

    :

답변

4

JavaScript에서만 선언문을 올립니다.

function 선언의 경우 전체 문언 본문 (foo의 경우 비어 있음)이 포함됩니다. 그러나 var과 함께 할당은 선언의 일부로 간주되지 않으며 명령문이 있던 위치에 남아 있습니다. (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;` 
} 

는, 기준이 무엇 bar() 반환 결과 typeoffunctionfunction foo() {} 유형 언급된다되고하도록한다. (1)

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

"no-op"란 무엇입니까? –

+0

@GeorgeKatsanos [No operation or change.] (https://en.wikipedia.org/wiki/NOP)이 경우'var'는'foo'로 아무 것도하지 않습니다. 왜냐하면 이미' 함수 '([§10.5, steps 5 and 8.c] (http://ecma-international.org/ecma-262/5.1/#sec-10.5)). –

+0

그래서 나는 그것을 직선적으로 얻는다. 이유 함수는 경고를 받는다. 반환되기 전에 foo 선언을 올려 놓기 때문이다. 많은 감사합니다, 그것은 그것을 깨끗하게한다. 나는 https://gist.github.com/MattSurabian/8867307을 확인하고 있었고 그의 설명은 같지 않거나 충분히 명확하지 않았다. 어떻게 생각해? –

6

당신은 그것을 이런 식으로 볼 수 있습니다 (호이 스팅).

관련 문제