2013-11-01 5 views
63

내가 자바 스크립트에 새로운 오전 그리고 난 다음, 로컬 및 글로벌 변수 범위에 대한 몇 가지 사례를하고 있었는데 내 코드 (fiddle)입니다 myname이 정의되지 않은 것으로 표시됩니다. 그래서 내 혼란은 왜 내가 myname의 글로벌 인스턴스에 액세스 할 수 없으며 만약 내가 함수 안에서 myname을 정의하지 않으면 잘 동작 할 것이다.자바 스크립트는 로컬 및 글로벌 변수 혼란

+1

** alert (window.myname); ** 그러면 값을 얻을 수 있습니다. –

+0

@dholakiyaankit 아직 정의가 없다고 말하는 window.myname을 사용해 보았습니다 ... –

+0

@BharatSoni window.myname이 내 작품에서 작동합니다. 브라우저. – EmptyArsenal

답변

6

글로벌 변수를 대체하지 않습니다. 무슨 일이 일어나고 있는지 "가변 호이 스팅"이라고합니다. 즉, var myname;이 함수의 맨 위에 삽입됩니다. 당신이 그 (것)들에게 를 사용하기 전에 항상 변수를 초기화 -이 시도 :

var myname = "initial"; 
 

 
function c() { 
 
    alert(myname); 
 
    myname = "changed"; 
 
    alert(myname); 
 
} 
 

 
c();

+0

선생님, 저는 단지 값을 바꾸려고하는 것이 아닙니다. 당신이하는 일은 글로벌 변수 자체의 가치를 변화시키는 것입니다. "왜 그런가"라는 개념을 이해하고 싶습니다 ... –

+0

이것은 경고의 문제를 수정합니다 undefined이지만 글로벌 변수'myname' 만 사용하므로 모든 로컬 변수가 제거됩니다. – EmptyArsenal

+0

글로벌 변수를 대체하지 않습니다. 무슨 일이 일어나고 있는지 "가변 호이 스팅"이라고합니다. 즉, myname var myname; 함수의 맨 위에 삽입됩니다. 변수를 사용하기 전에 항상 변수를 초기화하면 http://stackoverflow.com/questions/11938961/understanding-global-local-scope-in-javascript?rq=1 –

42

자바 스크립트에서 변수 선언이 자동으로 함수의 상단으로 이동합니다. 따라서 통역사는 다음과 같이 보입니다.

var myname = "initial" 
function c(){ 
    var myname; 
    // alerts undefined 
    alert(myname); 
    myname = "changed"; 
    // alerts changed 
    alert(myname); 
} 
c(); 

이것을 '호이스트'라고합니다.

호이 스팅 (hoisting)과 모든 변수의 범위가 선언 된 함수이기 때문에이 혼동을 피하기 위해 모든 변수를 함수의 맨 위에 나열하는 것이 일반적입니다.

+0

을 이해할 수 있으므로 지금 참조하십시오. 로컬 변수와 같은 이름의 전역 변수에 접근하는 방법 .. ?? –

+2

'window.myname'을 실행하여 액세스 할 수 있어야합니다. 여기를 참조하십시오 : http://stackoverflow.com/questions/15826751/access-overridden-global-variable-inside-a-function 그러나 일반적으로 전역 변수는 좋은 방법으로 간주되지 않으며 대부분의 경우에는 전역 개체와 그것을 통해 액세스 할 수 있습니다. 즉,'var me = {myname : "initial"}'은 함수에서'me.myname'을 호출합니다. – EmptyArsenal

+1

변수 선언이 위로 이동한다고 말하는 것은 맞지 않습니다. 예를 들어, 10 행에 var myname = "initial"이라고 쓰면, 우리가 보는 결과는 1 행에서 var myname = "initial"과 같지 않지만 var myname이 1 행에 있고 행에 실제로있는 것처럼 동작을 봅니다 10 값이 지정됩니다. 즉, myname = "initial" –