전역 유효 범위에서 코드를 작성한다면 var문을 생략해도 문제가 되지 않지만, 지역 변수를 선언하려면 언제나 반드시 var문을 써야한다. C,C++,자바와는 달리 자바 스크립트에서는 블록 단위의 유효 범위라는 것이 존재하지 않는다. 함수 안에서 정의된 변수는 그것이 정의된 위치에 관계없이 항상 함수전체에 걸쳐 유효하다.
function test(o)
{
var i = 0; // i는 함수 전체에 걸쳐 정의된다.
if (typeof o == "object") {
var j = 0; // j는 이 블록뿐 아니라 함수 전체에 걸쳐 정의된다.
for (var k=0; k < 10; k++) { // k는 루프뿐만 아니라 함수 전체에서 정의된다.
document.write(k);
}
document.write(" ");
document.write(k); // k는 여전히 정의되어 있다. 10이 출력된다.
}
document.write(" ");
document.write(j); // j는 정의되어 있지만, 초기화되지 않았을 가능성이 있다.
}
위 결과는 0123456789 10 0이 나온다.
다음 코드를 실행해보면 확실히 알 수 있다.
var scope = "global";
function f() {
alert(scope); // "global"이 아닌 "undefined"를 표시한다.
var scope = "local"; // 변수는 이곳에서 초기화되었지만 함수 전체에 걸쳐 정의되어 있다.
alert(scope); // "local"을 표시한다.
}
f();
자바스크립트의 유효 범위 규칙때문에 첫번째 alert에서 undefined가 출력된다.
어떤 함수에서건 모든 변수의 선언을 함수의 시작부에서 두는 것이 좋은 프로그래밍 습관임임을 알 수 있다.
Firefox 2.0이후나 Java의 JavaScript 엔진인 Rhino 1.7.R1이후에서 사용할 수 있는 JavaScript1.7부터는 블록 유효범위를 사용할 수 있는 let 키워드가 추가되어 있다.
JavaScript 1.7의 새 기능을 사용하려면, 코드에 JavaScript1.7을 사용하겠다고 명시해주어야 한다. (script type="application/javascript;version="1.7")
function varTest() {
var x = 31;
if (true) {
var x = 71; // same variable!
alert(x); // 71
}
alert(x); // 71
}
function letTest() {
let x = 31;
if (true) {
let x = 71; // different variable
alert(x); // 71
}
alert(x); // 31
}
위 코드의 결과는 파이어폭스에서만 확인 가능했다.