JavaScript 선언 향상

1 인례 및 기본 원리
JavaScript 선언 향상을 배우기 전에 다음 예제를 살펴보겠습니다.

console.log(a);
var a=2;
실행 결과는 무엇입니까?다음과 같은 추측이 있을 수 있다.
1. ReferenceError: a is not defined;
2. 인쇄 2;
3. undefined를 인쇄합니다.
정확한 결과는 세 번째입니다. undefined를 인쇄합니다.
다음은 구체적인 원인을 살펴보자.사실, var a=2에 대해서는JavaScript는 다음 두 가지 선언으로 간주합니다.
  • 정의 성명 var a는 번역 단계에서 진행된다
  • 부치 성명 a=2, 제자리에 남아서 집행 단계를 기다릴 것입니다..
  • 이른바 성명 향상: 자바스크립트는 var 변수 성명과 함수 성명을 각자의 역할 영역의 맨 위로 올리고 값 부여 작업은 향상되지 않는다.
    따라서 위의 예는 이러한 절차에 따라 처리됩니다.
    
    var a;
    console.log(a);
    a=2;
    
    우리는 var 변수 성명이 향상될 뿐만 아니라 함수 성명도 마찬가지로 향상될 수 있다는 것을 알아야 한다. 지금 아래의 예를 보면
    
    foo();
    function foo(){
     console.log(a);
     var a=2;
    }
    
    이 예는 undefined를 인쇄하는 실행 결과입니다.이 코드는 실제로 다음과 같은 형식으로 이해됩니다.
    
    function foo(){
     var a;
     console.log(a);
     a=2;
    }
    foo();
    
    2 성명 승급에 관한 흔한 질문
    2.1 함수 표현식
    먼저 함수 표현식의 예를 보십시오.
    
    console.log(foo);
    var foo=function(){}
    
    위 코드의 실행 결과는:undefined 인쇄입니다.실제로 변수 식별자 foo는 향상되었지만 그 부여 조작은 향상되지 않았다. 우리는 다음과 같은 형식으로 이해할 수 있다.
    
    var foo;
    console.log(foo);
    foo=function(){}
    
    결론: 함수 성명은 향상되지만 함수 표현식은 향상되지 않습니다.
    2.2 선언된 우선 순위
    만약 같은 작용역 내에 동명의 함수 성명과 var 변수 성명이 존재한다면 어떤 상황이 발생할까요?우리는 마찬가지로 한 가지 예를 다시 보았다.
    
    function a(){}
    var a;
    console.log(a);
    
    
    var a;
    function a(){}
    console.log(a);
    
    위의 두 가지 쓰기 방법은 실행 결과가 모두 인쇄 a () {}입니다.즉, 같은 작용역 내에 같은 이름의 함수 성명과 var 변수 성명이 존재한다면 함수 성명의 우선순위가 더욱 높다는 것이다.
    같은 작용역 안에 같은 이름의 함수 성명이 여러 개 존재하는 경우도 있다.이 경우, 뒤에 성명된 것은 앞의 성명을 덮어씁니다.
    3 연습 문제
    3.1 제1문제
    
    var getName = function() {
     console.log(1);
    }
    function getName() {
     console.log(2);
    }
    getName();
    
    답안: 인쇄 1
    해석: 승급 후 순서는 다음과 같다.
    
    var getName;// , 
    function getName() {
     console.log(2);
    }
    getName = function() {// 
     console.log(1);
    };
    getName();
    
    3.2 두 번째 문제
    
    var a = 1;
    function b(){
     a = 10;
     return;
     function a(){
      console.log(a);
     } 
    }
    b();
    console.log(a); 
    
    답안: 인쇄 1
    해석: 우선, 우리는 성명의 향상을 정리해야 한다.
    이 문제는 몇 가지 관건이 있는데, 우리는 알아야 한다.
    함수 b 내의 a 함수는return 이후이지만 효력을 잃지 않습니다. 성명 향상이 발생하여 b 함수 작용역의 맨 위로 올라갑니다.
    많은 어린이 신발(예를 들어 나TAT)은 이 문제의 답이 10이라고 잘못 생각할 수도 있다. 우리가 마지막에 b 함수를 호출하여 전역 변수 a를 수정했다고 생각할 수도 있다.실제로 함수 a에 성명 향상이 발생하여 함수 b 내에서 전역 작용역의 변수 a를 가리기 때문에 a=10;사실은 함수 a를 다시 부여하는 것이다.진일보한 테스트를 위해 여러분은 a 함수를 주석할 수 있습니다. 이때 답이 10이 되었다는 것을 발견할 수 있습니다.
    주: 본 문제는 패키지 관련 지식도 언급되었는데 이 문제에 대한 상세한 해석은 참고자료[2]를 참고하여 매우 상세하게 설명하십시오.
    
    var a;// a 
    function b(){
     function a(){// a 
       console.log(a);
      }
     a = 10;// a , a
     return; 
    }
    a = 1;// a
    b();
    console.log(a); 
    
    4 참고 자료
    [1] 《 네가 모르는 자바스크립트
    [2] js에서 변수 이름과 함수 이름의 중명 문제, Charles_Tian
    [3] 함수 성명과 변수 성명의 향상 메커니즘 우선순위 문제, 채소새의 분투사
    다음은 자바스크립트 성명 향상에 대한 상세한 내용입니다. 자바스크립트 성명 향상에 대한 더 많은 자료는 저희 다른 관련 글을 주목해 주십시오!

    좋은 웹페이지 즐겨찾기