함수 향상 꿀 행동

2828 단어 자바 script
JS 에 서 는 변수 가 향상 되 고 함수 가 향상 되 는 것 으로 알려 져 있 습 니 다.ES6 이전 에는 블록 급 역할 영역 이 없 었 습 니 다.
그러나 함수 성명 의 방법 으로 function 을 정의 하고 ES6 가 아 닌 {} 을 만 났 을 때 꿀 행동 이 있 습 니 다.
한 문제 로 인 한 참사.
    if (true) {
      a = 1
      function a() {}
      // a = 1
      console.log(a)
    }
    console.log(a)
    if (true) {
      // a = 1
      function a() {}
      a = 1
      console.log(a)
    }
    console.log(a)

이상 적 인 상태 에서: if(){} 에 존재 하지 않 습 니 다 let, const.블록 급 작용 역 은 발생 하지 않 을 것 입 니 다.다시 함수 에 따라 향상 시 키 면 상기 두 가 지 는
    function a() {}
    a = 1
    console.log(a)
    console.log(a)

즉 출력 Block, 1실제 상황 은 전자 1, 1 후자 1, 1디 버 깅 분석f a(){} 디 버 깅 분석 문 제 는 먼저 문 제 를 간소화 한다.
    debugger
    console.log(a)
    if (true) {
      debugger
      function a() {}
      debugger
    }
    console.log(a)

출력 debugger, undefined 첫 번 째 f a(){}, js 가 실행 되 기 시 작 했 을 때 전체 적 으로 a 를 밝 혔 으 나 정의 되 지 않 았 습 니 다.
두 번 째 debugger, debugger 의 함수 가 전체 국면 이 아 닌 블록 급 역할 영역 a 으로 향상 되 었 습 니 다.
세 번 째 Block 에서 야 debugger 내의 Block 값 을 전역 a 에 부여 합 니 다.
왜 전체적인 성명 보 다 는 할당 이 라 고 강조 하 는 것 일 까?지금 a 을 보충 하여 과정 을 다시 한 번 보면 설명 할 수 있다.
    debugger
    console.log(a)
    if (true) {
      debugger
      a = 1
      debugger
      function a() {}
      debugger
    }
    console.log(a)

세 번 째 a=1debuger1Block 를 덮는다.
네 번 째 f a(){}debuger 의 정 의 를 실 행 했 을 때 전체 functiona 로 바 뀌 었 음 을 발견 할 수 있다.
마지막 으로 이 단계 가 실 행 된 전후 에 함수 성명 문 구 를 실행 할 때 js 는 블록 급 의 함수 명 속성 값 을 전체 함수 명 속성, 즉 1 에 부여 한 다 는 것 을 알 수 있다.실제 집행 상황 은 대략 다음 과 같다.
    var a;//       , function a(){}   。
    if (true) {
      let a = function a(){} //        
      a = 1
      window.a = a //         a     a
      console.log(a)
    }
    console.log(a)

개인 이해 총화
결론 은 단지 개인 이 결과 로부터 유도 할 뿐, 문 서 를 찾 아 보지 않 고 얻 은 것 이기 때문에 반드시 정확 한 것 은 아니다.
(비 es6 상황 에서) window.a = block.a 에 함수 성명 {} 이 존재 할 때 js 집행 상황 은 다음 과 같다.
  • js 가 실행 되 기 시 작 했 습 니 다. 함수 명 전역 성명 이지 만 정의 되 지 않 았 습 니 다
  • 함수 성명 function a(){} 에 들 어가 임시 {} 가 발생 하고 Block 함수 가 function 로 향상 되 었 습 니 다.
  • Block 의 정의 문 구 를 실행 할 때 까지 function 에서 이 함수 이름 의 속성 을 전역 (이 속성 심지어 유형 을 바 꾸 더 라 도) 에 할당 합 니 다. 예 를 들 어 Block.
  • 좋은 웹페이지 즐겨찾기