변수 범위의 경우 C, Java와 같은 언어는 "블록 범위"메소드를 채택합니다. 대조적으로, JavaScript는 "함수 스코프"방법을 채택합니다. 변수의 범위는 위치가있는 함수에 의해서만 결정되며 IF 및 For와 같은 논리적 블록과 관련이 없습니다. 예를 들어, 다음 예제는 C 및 Java와 같은 언어와 다른 JavaScript의 동작을 보여줍니다.
코드 사본은 다음과 같습니다.
기능(){
var s = 42; // s는 기능 전체에서 볼 수 있습니다
if (s> 3) {
var x = "test"; // x는 함수 전체에서 볼 수 있습니다
for (var i = 0; i <10; i ++) {
Console.log (i);
}
Console.log (i); // i는 기능 전체에 걸쳐 보입니다
}
Console.log (i);
Console.log (x);
}
C 및 Java와 같은 "블록 스코프"언어에서 IS 문 및 명령문이 완료된 것과 같은 논리적 블록 후에 이러한 논리적 블록 내부에 정의 된 변수는 파괴됩니다. JavaScript가 다릅니다. 변수가 함수 내에서 정의되는 한, 전체 함수의 모든 코드는 코드가 변수 정의 이전에 있더라도 변수에 액세스 할 수 있습니다.
코드 사본은 다음과 같습니다.
기능(){
Console.log (a); // 정의되지 않은
var a = "테스트";
Console.log (a); // 테스트
}
위의 예에서 A는 기능으로 정의되지 않은 경우 Console.Log (a)는 참조 오류를 던집니다. 이 정의가 변수 호출 명령문 이후에도 a가 함수로 정의되면, a에 대한 호출은 법적 조작입니다 (호출 문 후 변수의 정의가 발생하는 경우 호출 문의 변수 값이 정의되지 않음). 실제로, 함수의 VAR 키워드로 정의 된 모든 변수는 함수의 시작 부분으로 올라갑니다 (할당 작업은 var에 의해 정의 된 줄에 남아 있음). 예를 들어, 위의 코드는 다음과 같습니다.
코드 사본은 다음과 같습니다.
기능(){
var a;
Console.log (a); // 정의되지 않은
a = "테스트";
Console.log (a); // 테스트
}
변수의 범위 체인
JavaScript에서 변수 저장에 접촉하면 "기능 범위"와 JS의 들어 올리는 것을 잘 이해할 수 있습니다. 변수는 글로벌 객체 또는 함수 호출 개체에 저장되므로 함수의 변수를 정의 할 때 변수가 함수 호출에 정의되는 위치에 관계 없이이 변수와 동일한 이름을 가진 속성은 필연적 으로이 함수 호출에서 사용하는 함수 호출 객체에 나타납니다. 이를 통해 기능의 어느 곳에서나 변수에 액세스 할 수 있습니다.
함수 호출과 관련하여 JavaScript에는 또 다른 흥미로운 개념이 있습니다. 변수의 범위 체인 - 변수는 글로벌 개체 또는 기능 호출 개체에 저장되므로 변수에 액세스 할 때 여러 객체에서 값을 얻을 수 있습니다. 다음 코드는 예입니다.
코드 사본은 다음과 같습니다.
var x = "테스트";
기능(){
// Level-1 함수
var x = "온도";
기능(){
// 레벨 2 기능
var x = "실제";
// 여기에서 X에 액세스하려고합니다. X는 "실제"입니다.
}
}
위 코드의 Level -2 함수 내부에서 X 변수에 액세스하려고 할 때 프로그램은 3 개 객체에서 해당 속성 값을 검색 할 수 있습니다. 레벨 2 함수를 호출하는 데 사용되는 함수 호출 객체, 레벨 1 함수를 호출하는 데 사용되는 기능 호출 객체 및 함수에 의해 정의 된 중첩 관계에 따라 Javascript는 글로벌 개체 및 함수 호출 개체를 생성합니다. 변수에 액세스 할 때 프로그램은 Access 문에 가장 가까운 객체에서 검색을 시작합니다. 검색이 발견되지 않으면 객체 체인의 이전 레벨의 객체에서 글로벌 객체까지 계속 검색됩니다.
이 객체 체인은 변수의 범위와 관련이 있으므로 "스코프 체인"이라고도합니다.
스코프 체인을 일시적으로 변경하고 객체를 스코프 체인의 프론트 엔드에 삽입 해야하는 경우 (먼저 액세스하는 기능 객체로서) with 문을 사용할 수 있습니다.
코드 사본은 다음과 같습니다.
(O) {
// 객체의 코드 사용 속성 o.
}
그러나 JavaScript 엄격한 모드에서는 진술이 비활성화됩니다. 비 스트릭 모드에서도 진술이 권장되지 않습니다.