>  기사  >  웹 프론트엔드  >  JavaScript 변수 선언 및 전역 변수의 지역 변수 교체에 대한 자세한 설명

JavaScript 변수 선언 및 전역 변수의 지역 변수 교체에 대한 자세한 설명

伊谢尔伦
伊谢尔伦원래의
2017-07-18 09:54:232296검색

함수 본체 외부에 정의된 것은 전역 변수이고, 함수 본체 내부에 정의된 것은 지역 변수입니다. 여기서 정의는 var를 통한 선언을 의미합니다.

JavaScript에는 암시적 전역 개념이 있습니다. 즉, 선언하지 않은 모든 변수는 전역 개체 속성이 됩니다. 예:

function test(){
    myname = "huming";
    alert(myname);
}
test();  // "huming"
alert(myname);  //"huming"

두 결과는 동일하며 이는 myname이 전역 변수임을 나타냅니다.

그렇다면 암시적 전역 변수와 명시적으로 정의된 전역 변수 사이에 차이점이 있나요? . 대답은 확실히 yes입니다. 다음 예를 보세요.

// 定义三个全局变量
var global_test1 = 1;
global_test2 = 2; // 反面教材
(function () {
    global_test3 = 3; // 反面教材
}());
// 试图删除
delete global_test1; // false
delete global_test2; // true
delete global_test3; // true
// 测试该删除
alert(typeof global_test1); // "number"
alert(typeof global_test2); // "undefined"
alert(typeof global_test3); // "undefined"

위 예에서 알 수 있듯이 함수 외부에서 var로 정의된 global_test1은 삭제할 수 없으며, var로 정의되지 않은 global_test2와 global_test3은 삭제됩니다( 함수 본문 내에서 생성되는지 여부).

요약하자면, 함수 몸체 외부에서 var를 통해 선언된 전역 변수는 삭제할 수 없지만 암시적 전역 변수는 삭제할 수 있습니다.

참고: JavaScript에는 "호이스팅"(일시 중지/상위 구문 분석/사전 구문 분석)이라는 동작이 있습니다.

예를 들어 설명하겠습니다.

var myname = "huming"; //声明全局变量
function test() {
    alert(myname);
    var myname = "local_huming";
    alert(myname);
}
test();

두 경고의 내용이 일치한다고 생각하시나요? ? 일관성은 말할 필요도 없이 일관성이 없습니다. . 실제 출력은 "정의되지 않음", "local_huming"입니다.

위의 예는

var myname = "huming"; //声明全局变量
function test() {
  var myname;
  alert(maname);<br>  myname = "local_huming";
  alert(myname);    // "local"
}
test();

와 같습니다. 처음으로 경고에 의해 출력되는 myname은 여러분이 생각하는 전역 변수가 아니라 그것과 동일한 범위(함수 본문)에 있는 지역 변수입니다. 선언되지는 않았지만 그렇게 처리됩니다. 이것을 "호이스팅"이라고 합니다.

이 점을 분명히 해야 합니다. 함수 본문에서 변수를 사용한 후 나중에 다시 선언하면 오류가 발생할 수 있습니다.

작성 사양:

function test() {
   var a = 1,
       b = 2,
       c = a + b,
       d = {},
       e,
       f;
   // function body...
}

이점은 다음과 같습니다.

1. 모든 지역 변수는 함수 시작 부분에 정의되므로 변수를 정의하기 전에 쉽게 찾을 수 있습니다.

교체 방법?

JavaScript 성능을 향상시키는 방법에 관해 가장 일반적으로 듣는 조언은 전역 변수 대신 지역 변수를 사용하라는 것입니다. 이 조언은 웹 개발 분야에서 9년 동안 일하면서 항상 저에게 질문을 던진 적이 없으며, 이 조언의 기초는 JavaScript의 범위 지정 및 식별자 확인(식별자 확인) 방법 처리에서 비롯됩니다. , 우선, JavaScript에서 함수의 기능은 객체를 생성하는 과정이라는 점을 분명히 해야 합니다. 각 함수 개체에는 함수가 생성될 때의 범위 정보가 포함된 [[Scope]]라는 내부 속성이 있습니다. 실제로 [[Scope]] 속성은 객체(가변 객체)의 목록에 해당하며, 목록에 있는 객체는 함수 내에서 접근할 수 있습니다. 예를 들어, 전역 함수 A를 생성하면 A의 [[Scope]] 내부 속성에는 하나의 전역 객체(전역 객체)만 포함되고, A에서 새 함수 B를 생성하면 B의 [[Scope] ] 속성에는 다음이 포함됩니다. 두 개체, 함수 A의 활성화 개체 개체가 앞에 있고 전역 개체(Global Object)가 뒤에 있습니다.

함수가 실행되면 실행 가능한 개체(Execution Object)가 자동으로 생성되어 범위 체인(Scope Chain)에 바인딩됩니다. 범위 체인은 식별자 확인을 위해 다음 두 단계를 통해 설정됩니다.

먼저 함수 객체 [[Scope]]의 내부 속성에 있는 객체들을 순서대로 스코프 체인에 복사합니다.

두 번째로, 함수가 실행되면 새로운 활성화 개체 개체가 생성됩니다. 이 개체에는 이에 대한 정의, 매개 변수(인수) 및 로컬 변수(이름이 지정된 매개 변수 포함)가 포함됩니다. . 도메인 체인의 앞부분입니다.

        JavaScript 코드 실행 중 식별자가 발견되면 식별자 이름을 기준으로 실행 컨텍스트(실행 컨텍스트)의 범위 체인에서 검색됩니다. 범위 체인의 첫 번째 개체(함수의 활성화 개체)부터 시작하여 찾을 수 없는 경우 범위 체인에서 다음 개체를 검색하는 식으로 식별자 정의를 찾을 때까지 계속됩니다. 범위의 마지막 개체, 즉 전역 개체를 찾을 수 없으면 오류가 발생하고 사용자에게 변수가 정의되지 않았다는 메시지가 표시됩니다. 이는 ECMA-262 표준에 설명된 함수 실행 모델 및 식별자 확인(식별자 확인) 프로세스입니다. 실제로 대부분의 JavaScript 엔진이 이러한 방식으로 구현되는 것으로 나타났습니다. ECMA-262는 이 구조의 사용을 의무화하지 않고 기능의 이 부분만 설명한다는 점에 유의해야 합니다.

위 내용은 JavaScript 변수 선언 및 전역 변수의 지역 변수 교체에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.