2012-07-17 1 views
3

NodeJS에서 실행중인 .js 파일이 있습니다. 나는이 파일을 실행하면자바 스크립트에서 (어휘) 변수 범위를 이해하는 데 도움이 필요합니다.

var ctry = "America"; 

function outer(msg) { 
    console.log(msg + " " + ctry) ; 
    var ctry = "Canada" ; 
} 
outer("God Bless"); 

, 나는 "하나님은 미국을 축복"볼 것으로 예상하지만 대신에, 나는 "하나님은 정의되지 않은 축복"을 참조하십시오 여기 내 파일의 내용이다.

내 var ctry = line을 주석 처리하면 "God Bless America"가 표시되고 console.clog를 console.log 위에 놓으면 "God Bless Canada"가 표시됩니다. 이 마지막 두 경우는 논리적 인 것처럼 보이지만 console.log 다음에 var ctry의 정의가 위의 코드에서 underfined로 설정되는 이유는 무엇입니까?

답변

5

(케이스에 ctry)이 로컬 변수의 범위 (변수가 함수의 상단에 선언 된 것처럼 즉,) 선언 된 함수의 전체이다. 당신이 출력에 undefined을 얻을 지금은 이유가 명확해야

function outer(msg) { 
    var ctry ; 
    console.log(msg + " " + ctry) ; 
    ctry = "Canada" ; 
} 

: 코드는 위의 의미와 동일합니다.

+0

명확하게하기 위해 모든 var 선언은 함수의 맨 위로 올라갑니다. 실제 할당은 작성된 행에서 발생합니다. 변수 var를 사용했기 때문에 전역 변수를 사용하는 대신 변수를 지역 변수로 다시 선언해야합니다. 키워드 var로 ctry를 다시 선언하지 않았다면 전역 변수를 사용하여 예상했던대로 작동했을 것입니다. – dqhendricks

+0

예. 나는 함수 정의가 올라간다고 생각했지만 var 선언 (지역 변수)에 대해서도 몰랐다. 고맙습니다 – bachposer

2

함수 내부에 var ctry이라고 말하면 함수 내부에있는 한 ctry에 대한 모든 호출이 (다시 말하면 중요하지 않습니다) 어디에서 발생합니까? 전역 변수가 아닌 내부 변수를 참조하십시오. 문제는 JS 인터프리터가 변수의 정의 만보고 있지만 해당 행을 실행할 때까지 값 (캐나다)으로 초기화하지 않으므로 console.log에서는 아직 정의되지 않았습니다.

관련 문제