このコード スニペットにより、コンソールに「Uncaught ReferenceError: x is not Defined」というエラーが表示されるのはなぜですか
リーリーそして、このレコードは「未定義」ですか?
リーリー変数宣言と変数スコープを理解しようとしています。コード全体が同じページ内にあるため、ブーストが発生することが予想されます。しかし、console.log() が別の script タグで区切られているため、コンソールに「unknown」が記録されるだけでなく、エラーが発生します。
var
はプロモートされます。これは、たとえ宣言行がスコープの最後にあっても、それが定義されているスコープの先頭からアクセスできることを意味します。宣言する前に var にアクセスすると、宣言を実行し、場合によっては変数を特定の値に初期化する必要があるため、変数は未定義
になります。 これが 2 番目の例の仕組みです。ブーストについてはこちらをご覧ください:
https://developer.mozilla.org/en-US/docs/glossary/lifting
しかし、最初の例 2
には 2 つの異なるスコープがあるため、基本的に var は最初のスクリプトに存在しないため、エラーnot Defined
が発生します。var
とその範囲については、こちらをご覧ください:https://developer.mozilla.org /en-US/docs/Web/JavaScript/Reference/Statements/var
######重要###var を使用しないことを強くお勧めします。代わりに const
とと
letを使用してください。プロモーションに var を使用すると、デバッグや修正が困難なエラーが発生する可能性があります。運用環境で
varのみを使用する必要がある場合は、esbuild を使用してコードを適切な古いバージョンの JS にダウングレードしてください。
興味深いことに、
constlet
も
やや昇格されていますが、昇格された状態でこれらにアクセスすると、ランタイム エラーが発生します (これは一時的なデッド ゾーンと呼ばれます) )、これが、黙って
var を呼び出して、知らない潜在的なエラーを残すよりも、即座にエラーを受け取るため、より安全である理由です。一時的なデッドゾーンについて:
https://developer.mozilla .org/en-US/docs/Web/JavaScript/Reference/Statements/let#temporal_dead_zone_tdz