2011-01-12 2 views
0

가능한 중복 :
Javascript scoping variables theory이것의 의미는 무엇입니까? 엔진 버그 또는 무엇?

안녕 모두,

나는 뭔가 낯선 사람을 물어보고 싶은. 여기에 코드가 있습니다.

사람이 내가 "정의"는 무엇입니까 이유 설명 할 수

 
var a = "defined"; 
function f() { 
    alert(a); 
    var a = 5; 
} 
f(); 

경고 "정의되지 않은".

파티 흐 .. 자바 스크립트 ㅏ라고

+1

[자바 스크립트 범위 지정 이론] (http://stackoverflow.com/questions/4405749/javascript-scoping-variables-theory) – deceze

답변

2

은 내가 가정합니다. 그에게 및 솔루션에 대한 자세한 내용을 보려면이 비디오를 체크 아웃 :

http://net.tutsplus.com/tutorials/javascript-ajax/quick-tip-javascript-hoisting-explained/

가 작동하려면, 당신은 var 키워드 형태 변수 a 제거해야합니다 : 그래서 기본적으로

var a = "defined"; 
function f() { 
    alert(a); 
    a = 5; 
} 
f(); 

을, 그것은 가변 범위 문제입니다. var 키워드를 제거하면 전역 적으로 변수를 사용할 수 있습니다. 따라서 이번에 제기 된 오류는 없습니다.

+0

의 본질적으로 정확한 복제본 그러나 'var'을 제거하면 원하는 것을 수행하지 못할 수도 있습니다. 이제 전역 변수가 엉망이되었습니다. (덜 놀랍지 만). – Thilo

+2

흥미 롭습니다. 이것은 내가 몰랐던 것이고, 나는 그것이 아직 나를 붙 잡지 않았다는 것에 놀랐다. 링크를 가져 주셔서 감사합니다. – crdx

0

이 기능에서는 새로운 범위를 얻습니다.

이 함수의 var a은 전역 변수를 마스크하는 로컬 변수 a을 선언합니다.

a에 대한 지정은 (경보 후) 나중에 발생하므로 a은 정의되지 않습니다.

혼란스러운 부분은 var a 선언이 함수의 최상위 또는 다른 위치에 있으면 (if 내부에있을 수도 있음) 문제가되지 않는다는 것입니다. 효과는 동일합니다. 해당 범위에 대한 변수를 선언합니다 (선언 앞에있는 코드의 경우에도 효과가 있음). 그래서 jslint는 모든 지역 변수를 맨 위에 선언 할 것을 권장합니다.