javascript - if 문이 함수 선언에 미치는 영향
滿天的星座
滿天的星座 2017-06-12 09:27:40
0
3
699
으아악 으아악

함수 선언 승격이 if 범위로만 승격된다면 위와 같은 이유는 무엇인가요? (크롬 58 테스트) 왜 외부에서 접근 가능한 범위 내의 기능이 가능한지 답변 부탁드립니다

滿天的星座
滿天的星座

모든 응답(3)
伊谢尔伦

이건 사실 역사적인 문제인데...

이전 ES5의 사양에서는 함수가 최상위 범위와 함수 범위에서만 선언될 수 있고 블록 수준 범위에서는 선언될 수 없다고 규정했습니다. 따라서 이와 같은 진술은 실제로 불법입니다.

으아악

그러나 실제로 모든 주요 브라우저는 호환성 고려 사항으로 인해 이 사양을 준수하지 않습니다.

현재 ES6 시대에는 사양에 블록 수준 범위의 존재가 명시되어 있으며, 블록 수준 범위에서 기능을 정의할 수 있습니다.
그러나 실제로는 그렇게 간단하지 않습니다. 왜냐하면 이 경우 정의된 함수의 동작이 과거와 호환되지 않기 때문입니다. ES6는 과거와의 호환성을 보장하기 위해 브라우저 구현에 필요하지 않다고 규정하고 있습니다. 위의 규정을 준수하기 위해 자신만의 행동 방식을 가지십시오.


ES6 브라우저에서는 실제로 다음과 같이 동작합니다:

  1. 블록 범위에서 함수 정의 허용

  2. 함수 선언은 실제로 var를 사용하여 선언된 함수 표현식과 유사하며, 함수 이름은 현재 함수 범위의 맨 위로 승격됩니다

  3. 동시에 함수 선언은 블록 수준 범위에서 호이스팅 동작도 유지합니다

첫 번째 코드의 경우 보고되는 오류를 자세히 살펴보면 Uncaught TypeError: e는 함수가 아닙니다와 같은 오류를 발견할 수 있습니다. Uncaught TypeError: e is not a function
这个错误表示,e不是函数,换句话来说,就是e이 오류는 e가 함수가 아니라는 의미입니다. 즉, 변수 e가 존재하지만 함수가 아니라는 의미입니다. 위에서 언급한 세 가지 규칙을 결합하면 실제로 다음과 같이 실행된다고 생각하기 쉽습니다.

으아악

변수 승격 후에는 다음과 같이 됩니다:

으아악

두 번째 코드 부분은 언급할 필요가 없습니다.

滿天的星座

if 문 내의 함수 선언은 함수 표현식과 마찬가지로 승격되지 않으므로 첫 번째는 구문 오류이고 두 번째는 10을 출력합니다

学霸

으아악

=>

에 해당 으아악
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿