javascript - Const 不是在全局范围内定义的,而是在局部范围内定义的?

标签 javascript scope constants hoisting

为什么const不是在全局作用域定义,而是在局部作用域定义? screenshoot from devTools

{
    console.log(b);
    const b = 2;
}
VM366:2 Uncaught ReferenceError: Cannot access 'b' before initialization
    at <anonymous>:2:17

console.log(a);
const a = 1;
VM382:1 Uncaught ReferenceError: a is not defined
    at <anonymous>:1:13

最佳答案

这似乎与处理 REPL 输入的一些“魔法”有关。这并不是 JavaScript 通常工作方式的真正属性。

如果你在 node.js 文件中尝试这个,在 <script> ,甚至在 (0, eval)('...') 中,您将按预期获得“初始化前无法访问‘a’”。请注意,如果您处于暂停调试器状态,即使在 DevTools 控制台中也不会发生这种情况。

在非暂停状态下(),DevTools 允许您像连续编写脚本一样声明变量,并且声明将跨命令持续存在。在常规 JavaScript 之外显然有“魔法”,因为即使是 eval将创建另一个临时范围。这种“魔法”由 V8 本身处理。因此,这里使用的任何诡计很可能会产生这种轻微意外错误的副作用。 (我最初认为副作用是没有提升变量声明,但如果你这样做 a = 0; const a = 1 那么你会得到“分配给常量变量”,所以情况似乎并非如此。)

我试图追根溯源,但我迷失在 V8 的深处。尽管如此,我发现(通过打开另一个 DevTools 来调试 DevTools 本身!)这只有在 replMode 时才会发生。参数(传递给 V8 后端的 evaluate 方法)为真。这可以通过设置断点来验证 here并更改 options.replMode 的值.

replModedocumented如下:

Setting this flag to true enables let re-declaration and top-level await. Note that let variables can only be re-declared if they originate from replMode themselves.

关于javascript - Const 不是在全局范围内定义的,而是在局部范围内定义的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72873581/

相关文章:

javascript - 为什么 HTML/React 页面出现语法错误

javascript - 如何使用并行网络 worker ?

javascript - 将数组的每个元素写入文件的新行的最佳方法是什么?

r - 理解 R 中的词法作用域

ruby - 如何访问 ruby​​ 中的(阴影)全局函数

c++ - VC++ 错误 : array instantiation with size from templated static const

javascript - 如何确保&lt;script&gt;标签成功加载Javascript?

java - 如何在for循环中调用变量?

javascript - 为什么 const 在 if() 或 try{}catch(e){} 中多次运行代码时会抛出错误?

iOS:Swift 常量文件