"JavaScript 고급 프로그래밍" 7장 함수, 함수 선언의 승격과 관련하여 다음과 같은 예가 있습니다.
으아아아책의 원문은 다음과 같습니다.
표면적으로 위 코드는 조건이 true일 때 sayHi()의 한 정의를 사용하고, 그렇지 않으면 다른 정의를 사용한다는 의미입니다. 실제로 이는 ECMAScript의 잘못된 구문이며 JavaScript 엔진은 오류를 수정하고 합리적인 상태로 변환하려고 시도합니다. 그러나 문제는 브라우저가 오류를 수정하려는 시도에 일관성이 없다는 것입니다. 대부분의 브라우저는 조건을 무시하고 두 번째 문을 반환합니다. Firefox는 조건이 true인 경우 첫 번째 문을 반환합니다. 따라서 이 사용법은 위험하므로 코드에서 사용해서는 안 됩니다.
하지만 크롬과 js bin에서 테스트를 해보고 조건을 true로 변경했더니 "안녕하세요"라는 알림이 뜹니다. 책에서 언급한 "대부분의 브라우저는 두 번째 문을 반환하고 조건을 무시합니다"와 같은 문제는 없습니다. :
으아아아조언 부탁드립니다. 감사합니다!
true는 변수가 아닌 리터럴입니다. 브라우저는 구문 분석 시 다음과 유사하게 if 문을 직접 최적화합니다. 으아악
그러나 저자는 다른 상황을 언급하고 있습니다으아악
컴파일러는 이 코드를 얻은 후 동일한 범위에 두 개의 중복된 함수 선언이 있음을 발견합니다. 첫 번째 선언은 두 번째 선언으로 직접 대체됩니다.
js는 블록 내부에 함수를 선언하는 것을 권장하지 않습니다.
엄격 모드에서 이 코드는 오류를 직접 보고합니다.