찾다

 >  Q&A  >  본문

나중에 생성했지만 다른 스크립트 태그 내에서 변수에 대해 console.log()를 사용할 때 콘솔에 "정의되지 않음"을 기록하는 대신 오류가 발생하는 이유는 무엇입니까?

이 코드 조각이 콘솔에 "Uncaught ReferenceError: x is not Defined" 오류를 표시하는 이유

으아악

그리고 이 기록은 "undefine"인가요?

으아악

변수 선언과 변수 범위를 이해하려고 합니다. 그리고 전체 코드가 동일한 페이지에 있으므로 부스팅이 발생할 것으로 예상합니다. 하지만 console.log()가 다른 스크립트 태그로 분리되어 있기 때문에 "정의되지 않음"을 콘솔에 기록하는 대신 오류가 발생합니다.

P粉579008412P粉579008412446일 전558

모든 응답(1)나는 대답할 것이다

  • P粉536909186

    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。请改用 constlet。使用 var 进行提升会导致错误,有时很难调试和修复。如果您需要在生产中仅使用 var를 사용하지 않는 것이 좋습니다. 대신 constlet를 사용하세요. 승격을 위해 var를 사용하면 디버깅 및 수정이 어려운 오류가 발생할 수 있습니다. 프로덕션에서

    만 사용해야 하는 경우 esbuild를 사용하여 코드를 적절한 이전 버전의 JS로 다운그레이드하세요.

    constlet有点被提升,但是在提升状态下访问它们会导致运行时错误(这称为暂时的死区),这就是为什么它们更安全,因为您会立即收到错误,而不是静默地提升 var흥미롭게도 constlet다소 승격되었지만 승격된 상태에서 액세스하면 런타임 오류가 발생합니다(이를 임시 데드존이라고 함) ), 오류를 조용히 발생시키는 대신 즉시 오류를 발생시키므로 더 안전합니다.

    사용자가 알지 못하는 잠재적인 오류가 남게 됩니다.

    시간적 데드존 정보:

    https://developer.mozilla .org/en-US/docs/Web/JavaScript/Reference/Statements/let#temporal_dead_zone_tdz

    🎜 으아아아

    회신하다
    0
  • 취소회신하다