2014-06-05 6 views
14

나는 약간의 자바 스크립트 코드를보고 있었다에서 정의되지 않은 기대와 나는 같은 것을 우연히 :는 자바 스크립트

function() { 
    if(true) { 
     var a = 5; 
    } 
    alert(a); 
} 

내가이 정의되지 않은 출력을 것이라고 확신했지만, 그것을하지 않았다? 누군가 왜 저에게 말할 수 있습니까?

+0

그냥 호기심의'어쨌든 차단 if' ... – War10ck

+4

@pstenstrm의 핵심 기능 - 하나 여기에 포함 된 기능, 그리고 밖에있는 문이있다. 클로저는 관련성이 없습니다. – Quentin

+2

@poststrm Closure? 여기에는 폐쇄가 없습니다. –

답변

14

자바 스크립트에는 기능 수준 범위가 있으며 블록 수준 범위가 아닙니다. 자바 스크립트 블록 레벨 범위를 가지고 있다면

function() { 
    var a; 
    if(true) { 
     a = 5; 
    } 
    alert(a); 
} 

, 그것은 여전히 ​​undefined 출력되지 것 다음 var 문이 게양되어

그래서 코드는 동일합니다. aalert 문에서 선언되지 않으므로 참조 오류가 발생합니다.

+0

익명 함수가 호출되지 않았으므로 문법 오류입니다. –

+0

@IanClark 그것은 요점 외에도, 아마도 완전한 진술의 일부일 것입니다. –

+0

비록 그들이 호이스트/스코핑을 이해하지 못했기 때문에 언급하겠다고 생각했지만 :) –

2

변수 정의가 함수 상단으로 이동합니다 (변수 호이 스팅). 블록 수준 변수가 없습니다.

는 컴파일러는 블록 범위는 단지 글로벌 범위 \ 기능이없는

function() { 
    var a; 
    if(true) { 
     a = 5; 
    } 
    alert(a); 
} 
2

JS에 코드를 변경합니다.
var가 함수의 맨 위에 값없이 선언 된 다음 할당됩니다.

Here's 스코프에 대한 유용한 자습서.

+0

바로 그 때문입니다. – avcajaraville

3

이것이 작동하는 이유는 호이 스팅 (hoisting)의 결과입니다. Hoisting은 변수의 선언을 범위의 맨 위로 이동합니다. .

function() { 
var a; 
if(true) { 
    a = 5; 
} 
alert(a); 
} 

"변수 선언 (일반의 선언은) 코드가 실행되기 전에, 코드 어디에서나 변수를 선언하면 상단을 선언하는 것과 같습니다 처리되기 때문에이 : 그래서 당신의 기능은 정말 다음과 같습니다 또한 변수가 선언되기 전에 사용 된 것처럼 보일 수 있습니다.이 동작을 "호이 스팅 (hoisting)"이라고합니다. 변수 선언이 함수 또는 전역 코드의 맨 위로 이동했기 때문입니다. " - var MDN

+1

+1 Upvote. 이것은 완전한 대답입니다.호이 스팅과 공동으로 기능 수준 범위 지정이 주요 이유입니다. 잘 설명! –