변수 및 상수의 범위

JScript에는 전역, 지역 및 클래스의 세 가지 범위가 있습니다. 함수나 클래스 정의 외부에 변수나 상수를 선언하면 전역 변수가 되고, 프로그램 전체에서 그 값에 액세스하여 수정할 수 있습니다. 함수 정의의 내부에 변수를 선언하면 이 변수는 지역 변수입니다. 이 변수는 함수가 실행될 때마다 만들어지고 소멸되므로 함수 외부에서 액세스할 수 없습니다. 클래스 정의 내부에 변수를 선언하면 이 변수는 클래스 내에서 사용할 수 있고 전역 범위에서는 직접 액세스할 수 없습니다. 자세한 내용은 클래스 기반 개체를 참조하십시오.

토론

C++와 같은 언어의 경우에는 중괄호({})를 사용하여 새로운 범위를 정의하는 "블록 범위"가 있습니다. 그러나 JScript는 블록 범위를 지원하지 않습니다.

지역 변수는 전역 변수와 동일한 이름을 가질 수 있지만 전역 변수와 완전히 구별되며 별개의 것입니다. 따라서 한 변수의 값을 변경해도 동일한 이름의 다른 변수에 영향을 미치지 않으며 지역 변수가 선언된 함수 내부에서는 지역 버전만 인식합니다. 이를 표시 범위(visibility)라고 합니다.

// Define two global variables.
var name : String = "Frank";
var age : int = "34";

function georgeNameAge() {
   var name : String; // Define a local variable.
   name = "George";   // Modify the local variable.
   age = 42;          // Modify the global variable.
   print(name + " is " + age + " years old.");
}

print(name + " is " + age + " years old.");
georgeNameAge();
print(name + " is " + age + " years old.");

이 프로그램의 출력을 보면 전역 변수 값을 변경하지 않고 지역 변수가 수정될 수 있다는 것을 알 수 있습니다. 함수 내부에서 전역 변수를 변경하면 전역 범위에서 해당 값에도 적용됩니다.

Frank is 34 years old.
George is 42 years old.
Frank is 42 years old.

JScript는 코드를 실행하기 전에 변수 및 상수 선언을 처리하므로 선언이 조건 블록 내에 있든지 다른 생성자 내에 있든지 상관 없습니다. 변수와 상수를 모두 찾으면 함수 내의 코드를 실행합니다. 따라서 상수 선언문에 이를 때까지는 지역 상수 값이 정의되지 않으며 함수에서 변수가 할당될 때까지는 지역 변수가 정의되지 않습니다.

이 때문에 예상치 않은 결과가 나타날 수 있습니다. 다음 프로그램을 예로 들어 살펴봅니다.

var aNumber = 100;
var anotherNumber = 200;
function tweak() {
   var s = "aNumber is " + aNumber + " and ";
   s += "anotherNumber is " + anotherNumber + "\n";
   return s;
   if (false)  {
      var aNumber;                // This statement is never executed.
      aNumber = 123;              // This statement is never executed.
      const anotherNumber = 42;   // This statement is never executed.
   } // End of the conditional.
} // End of the function definition.

print(tweak());

이 프로그램은 다음과 같이 출력됩니다.

aNumber is undefined and anotherNumber is undefined

aNumber는 100 또는 123이고 anotherNumber은 200 또는 42일 것으로 예상할 수 있지만 이 두 값은 모두 undefined입니다. aNumber와 anotherNumber는 모두 지역 범위에 정의되므로 동일한 이름의 전역 변수 및 상수를 따릅니다. 지역 변수와 상수를 초기화하는 코드가 한 번도 실행되지 않으므로 이 두 값은 undefined입니다.

고속 모드에서는 명시적으로 변수를 선언해야 합니다. 고속 모드를 해제하면 암시적인 변수 선언이 필요합니다. 함수 내에 암시적으로 선언된 변수, 즉 var 키워드 없이 할당식 왼쪽에 표시되는 변수는 전역 변수입니다.

참고 항목

개념

정의되지 않은 값

기타 리소스

JScript 변수 및 상수