2012-11-02 6 views
3
var x = 3; 
(function(){ 
    console.log('before', x); 
    var x = 7; 
    console.log('after', x); 
    return ; 
})(); 

위 코드에서 var X는 전역으로 초기화됩니다. 그래서 함수 내에서 첫 번째 console.log는 "before 3"을 인쇄해야하지만 나는 그것을 얻지 못합니다. 그 이유는 전역 변수를 다시 선언하려고하기 때문입니다.전역 범위 변수로 인해 javascript 오류가 발생했습니다.

누군가가 왜 이런 일이 발생했는지 설명 할 수 있습니까?

+1

질문에 대답하는 링크 : http://www.adequatelygood.com/2010/2/JavaScript-Scoping-and-Hoisting FWIW, "hoisting"을보고 있습니다. –

답변

3

코드를 구문 분석 할 때 자바 스크립트 파서 Variable Hoisting 않습니다. 그래서 지역 변수 xundefined의 초기 값으로 처음에 선언됩니다

var x = 3; 
(function(){ 
    var x; 
    console.log('before', x); 
    x = 7; 
    console.log('after', x); 
    return ; 
})(); 

:이,이 코드가 실행 얻을 것이다 어떤 변수 선언이 경우에 따라서, 현재 범위의 상단으로 이동된다는 것을 의미합니다 .

먼저 console.log()에 대해 "사전 정의 됨"을 얻는 이유에 대해 설명해야합니다.

5

위의 코드에서 var X는 전역으로 초기화됩니다. 그래서 첫 번째 console.log는 "before 3"을 인쇄해야합니다. var에 관계없이 당신이 그것을 쓰기 곳의 함수의 처음부터 적용됩니다 때문에

아니, 그것은 before undefined를 인쇄해야합니다.

귀하의 코드는 다음과 정확히 같은 입니다 :

var x = 3; (function(){ var x; console.log('before', x); x = 7; console.log('after', x); return ; })(); 

그리고 물론

이 변수 값 undefined 시작합니다.

세부 사항 : Poor misunderstood var

+0

하지만 그렇다면 7시 이전에 표시되어야합니다 ... 맞습니까? – harikrish

+1

@harikrish 선언문이 과제가 아닌 맨 위로 이동되었습니다. – Sirko

+0

와우, 이것에 대해 알지 못했습니다! 이제 일부 코드를 리팩터링합니다! – clentfort

1

변수의 범위는 다른 언어보다 훨씬 간단하다. 이 선언에서 시작하지만,하지 않습니다 중 하나

  • 당신이 선언을 보유하고있는 기능
  • 선언이

MDN 함수가 아닌 경우 전역 범위 :

var로 선언 된 변수의 범위는 포함 함수 이거나 함수 외부에서 선언 된 변수의 경우 전역 범위 ( 은 전역 개체에 바인딩됩니다.

모든 변수 선언이 범위 (함수)의 시작 부분으로 이동했다고 상상해보십시오. 그래서이

var x = 3; 
(function(){ 
    var x; 
    console.log('before', x); // now undefined 
    x = 7; 
    console.log('after', x); // now 7 
    return ; 
})(); 

정확한 범위 (기능이 아닌 블록)이 무엇인지 이해하기 위해주의 정확히 같다 :

var x = 3; 
(function(){ 
    console.log('before', x); // this is undefined ! 
    if (true) { 
     var x = 7; 
    } 
    return ; 
})(); 
관련 문제