为什么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
的值.
replMode
是documented如下:
Setting this flag to true enables
let
re-declaration and top-levelawait
. Note thatlet
variables can only be re-declared if they originate fromreplMode
themselves.
关于javascript - Const 不是在全局范围内定义的,而是在局部范围内定义的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72873581/