이 코드 조각이 콘솔에 "Uncaught ReferenceError: x is not Defined" 오류를 표시하는 이유
으아악그리고 이 기록은 "undefine"인가요?
으아악변수 선언과 변수 범위를 이해하려고 합니다. 그리고 전체 코드가 동일한 페이지에 있으므로 부스팅이 발생할 것으로 예상합니다. 하지만 console.log()가 다른 스크립트 태그로 분리되어 있기 때문에 "정의되지 않음"을 콘솔에 기록하는 대신 오류가 발생합니다.
P粉5369091862023-09-13 00:07:23
var
被提升,这意味着它可以在定义它的范围的开头访问,即使声明行可能位于范围的末尾。如果您在声明之前访问该 var,则它是 未定义
여전히 선언을 수행해야 하고 변수를 특정 값으로 초기화해야 하기 때문입니다.
이것이 두 번째 예가 작동하는 방식입니다.
여기에서 부스팅에 대해 읽어보세요:
https://developer.mozilla.org/en-US/docs/glossary/lifting
그러나 첫 번째 예 2에서는
有 2 个不同的作用域,因此第一个脚本中基本上不存在 var ,因此错误 not Defined
. < /p>
여기에서 var
및 해당 범위에 대해 알아보세요.
https://developer.mozilla.org /en-US/docs/Web/JavaScript/Reference/Statements/var
중요
var
。请改用 const
和 let
。使用 var 进行提升会导致错误,有时很难调试和修复。如果您需要在生产中仅使用 var
를 사용하지 않는 것이 좋습니다. 대신 const
및 let
를 사용하세요. 승격을 위해 var를 사용하면 디버깅 및 수정이 어려운 오류가 발생할 수 있습니다. 프로덕션에서
const
和 let
也有点被提升,但是在提升状态下访问它们会导致运行时错误(这称为暂时的死区),这就是为什么它们更安全,因为您会立即收到错误,而不是静默地提升 var
흥미롭게도 const
및 let
도 다소 승격되었지만 승격된 상태에서 액세스하면 런타임 오류가 발생합니다(이를 임시 데드존이라고 함) ), 오류를 조용히 발생시키는 대신 즉시 오류를 발생시키므로 더 안전합니다.
시간적 데드존 정보:
https://developer.mozilla .org/en-US/docs/Web/JavaScript/Reference/Statements/let#temporal_dead_zone_tdz