为什么在之后创建的变量上使用 console.log() 但在另一个脚本标记中时,我会收到错误而不是在控制台中记录'未定义”?
P粉579008412
P粉579008412 2023-09-12 22:58:00
0
1
384

为什么此代码片段会在控制台中给出错误“Uncaught ReferenceError: x is not Defined

<body>
    <script>
        console.log(x);
    </script>
    
    <script>
        var x = 10;
    </script>
</body>

而这个记录“未定义”?

<body>
    <script>
        console.log(x);
        var x = 10;
    </script>
</body>

我试图了解变量声明和变量范围。并预计会发生提升,因为整个代码都在同一页面中。但因为 console.log() 被分开在另一个脚本标记中,所以我得到了一个错误,而不是仅仅在控制台中记录“未定义”。

P粉579008412
P粉579008412

全部回复(1)
P粉536909186

var 被提升,这意味着它可以在定义它的范围的开头访问,即使声明行可能位于范围的末尾。如果您在声明之前访问该 var,则它是 未定义,因为您仍然需要执行声明,并可能将该变量初始化为特定值。 所以你的第二个例子就是这样工作的。

在此处阅读有关提升的信息:

https://developer.mozilla.org/en-US/docs /术语表/起重

但是在第一个示例中 2 有 2 个不同的作用域,因此第一个脚本中基本上不存在 var ,因此错误 not Defined

在此处了解 var 及其范围:

https://developer.mozilla.org /en-US/docs/Web/JavaScript/Reference/Statements/var

重要 我强烈反对使用 var。请改用 constlet。使用 var 进行提升会导致错误,有时很难调试和修复。如果您需要在生产中仅使用 var,只需使用 esbuild 将代码降级为适当的旧版本 JS。

有趣的是,constlet有点被提升,但是在提升状态下访问它们会导致运行时错误(这称为暂时的死区),这就是为什么它们更安全,因为您会立即收到错误,而不是静默地提升 var ,从而给您留下一个您不知道的潜在错误。

关于颞死区:

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


    
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!