Heim > Fragen und Antworten > Hauptteil
Warum dieses Code-Snippet den Fehler „Uncaught ReferenceError: x is not Defined“ in der Konsole ausgibt
<body> <script> console.log(x); </script> <script> var x = 10; </script> </body>
Und dieser Datensatz ist „undefiniert“?
<body> <script> console.log(x); var x = 10; </script> </body>
Ich versuche, die Variablendeklaration und den Variablenbereich zu verstehen. Und erwarten Sie eine Steigerung, da sich der gesamte Code auf derselben Seite befindet. Da console.log() jedoch in einem anderen Skript-Tag getrennt ist, erhalte ich eine Fehlermeldung, anstatt nur „undefiniert“ in der Konsole zu protokollieren.
P粉5369091862023-09-13 00:07:23
var
被提升,这意味着它可以在定义它的范围的开头访问,即使声明行可能位于范围的末尾。如果您在声明之前访问该 var,则它是 未定义
,因为您仍然需要执行声明,并可能将该变量初始化为特定值。
所以你的第二个例子就是这样工作的。
在此处阅读有关提升的信息:
https://developer.mozilla.org/en-US/docs /术语表/起重
但是在第一个示例中 2
有 2 个不同的作用域,因此第一个脚本中基本上不存在 var ,因此错误 not Defined
。< /p>
在此处了解 var
及其范围:
https://developer.mozilla.org /en-US/docs/Web/JavaScript/Reference/Statements/var
重要
我强烈反对使用 var
。请改用 const
和 let
。使用 var 进行提升会导致错误,有时很难调试和修复。如果您需要在生产中仅使用 var
,只需使用 esbuild 将代码降级为适当的旧版本 JS。
有趣的是,const
和 let
也有点被提升,但是在提升状态下访问它们会导致运行时错误(这称为暂时的死区),这就是为什么它们更安全,因为您会立即收到错误,而不是静默地提升 var
,从而给您留下一个您不知道的潜在错误。
关于颞死区:
<body> <script> console.log(x); const x = 10; </script> </body>