2014-09-24 1 views
1

이 코드가 있습니다. 나는 올바른 출력으로 기대 한 의 'i' (의견에서) 값을 썼습니다. 그러나 출력/경고는 다릅니다.누군가이 바이올린의 출력을 설명 할 수 있습니까?

바이올린 : http://jsfiddle.net/e2jbno4a/
코드 :

var i = 10; 

function outer() { 
    alert(i); // 10 
    var i = 5; 
    alert(i); // 5 
    function inner() { 
     var i = 20; 
    } 
    inner(); 
    alert(i); // 5 
    if (1) { 
     var i = 30; 
    } 
    alert(i); // 5 
    setTimout(function() { 
     alert(i); // 5 
    }, 100); 
} 

outer(); 

누군가가 나를 출력에 대한 이유를 알려 수 있습니까? 아니면 특정 개념을 설명하는 포인터일까요?

+1

http://stackoverflow.com/questions/500431/what-is-the-scope-of-variables-in-javascript 플러스에 http : // javascriptissexy. com/javascript-variable-scope-and-hoisting-described/ – Cheery

+0

개념은 "어휘 범위"및 "호이 스팅" – elclanrs

답변

1

그래서, 단계적으로 :

var i = 10; 

function outer() { 
    alert(i); // undefined 
    var i = 5; 
    alert(i); // 5 (i now references the `i` in this function's scope.) 
    function inner() { 
     var i = 20; // (The `20` is only available in the scope of `inner`) 
    } 
    inner(); 
    alert(i); // 5 (So, this `i` still references the `var i = 5;` one) 
    if (1) { 
     var i = 30; 
    } 
    alert(i); // 30 (This one actually alerts `30`. There is no block scope in JS) 
    setTimeout(function() { 
     alert(i); // 5 (This will log `30`, you made a typo in the `setTimeout` call) 
    }, 100); 
} 

outer(); 
+0

대답이 잘못되었습니다. 첫 번째 변수는 정의되지 않은 값을 출력합니다. 맨 위에 표시된 중복 질문의 예제 '8'을 참조하십시오. – halkujabra

+0

@ halkujabra가 수정되었습니다. – Cerbrus