Mengapa coretan kod ini memberikan ralat "Rujukan Tidak DitangkapRalat: x tidak Ditakrifkan" dalam konsol
<body> <script> console.log(x); </script> <script> var x = 10; </script> </body>
Dan rekod ini "tidak ditentukan"?
<body> <script> console.log(x); var x = 10; </script> </body>
Saya cuba memahami pengisytiharan pembolehubah dan skop pembolehubah. Dan jangkakan peningkatan akan berlaku kerana keseluruhan kod berada dalam halaman yang sama. Tetapi kerana console.log() dipisahkan dalam teg skrip lain, saya mendapat ralat dan bukannya hanya mengelog "undefined" dalam konsol.
var
被提升,这意味着它可以在定义它的范围的开头访问,即使声明行可能位于范围的末尾。如果您在声明之前访问该 var,则它是未定义
kerana anda masih perlu melakukan pengisytiharan dan mungkin memulakan pembolehubah kepada nilai tertentu. Jadi ini adalah cara contoh kedua anda berfungsi.Baca tentang peningkatan di sini:
https://developer.mozilla.org/en-US/docs/glossary/lifting
Tetapi dalam contoh pertama 2
有 2 个不同的作用域,因此第一个脚本中基本上不存在 var ,因此错误not Defined
.Ketahui tentang
var
dan skopnya di sini:https://developer.mozilla.org /en-US/docs/Web/JavaScript/Reference/Statements/var
Penting Saya sangat menasihatkan agar tidak menggunakan
dalam pengeluaran, hanya gunakan esbuild untuk menurunkan taraf kod anda kepada versi lama JS yang sesuai.var
。请改用const
和let
。使用 var 进行提升会导致错误,有时很难调试和修复。如果您需要在生产中仅使用var
. Gunakanconst
danlet
sebaliknya. Menggunakan var untuk promosi boleh menyebabkan ralat yang kadangkala sukar untuk dinyahpepijat dan diperbaiki. Jika anda hanya perlu menggunakanconst
和let
也有点被提升,但是在提升状态下访问它们会导致运行时错误(这称为暂时的死区),这就是为什么它们更安全,因为您会立即收到错误,而不是静默地提升var
Menariknya,const
danlet
juga agak dipromosikan, tetapi mengaksesnya dalam keadaan tinggi menyebabkan ralat masa jalan (ini dipanggil zon mati sementara ), itulah sebabnya mereka lebih selamat kerana anda mendapat ralat serta-merta dan bukannya menaikkannya secara senyaphttps://developer.mozilla .org/en-US/docs/Web/JavaScript/Reference/Statements/let#temporal_dead_zone_tdz