当我尝试使用var定义变量时,一切正常。
但是将它定义为const并没有按预期工作,并且变量未定义。
window.eval("var v = 5;");
document.body.innerHTML += window.v === undefined;
window.eval("const l = 5;");
document.body.innerHTML += window.l === undefined;

我在Chrome和Node.js上测试过它。我错过了什么吗?
提前谢谢!
答案 0 :(得分:9)
这是因为const
默认情况下会启用严格模式。看看当你明确打开两个例子的严格模式时会发生什么:
window.eval("'use strict'; var v = 5;");
document.body.innerHTML += window.v === undefined;
window.eval("'use strict'; const l = 5;");
document.body.innerHTML += window.l === undefined;

有关严格模式的更多信息,请参阅:
特别是这部分:
其次,严格模式代码的 eval不会将新变量引入周围范围。在正常的代码中,eval(" var x;")将变量x引入周围函数或全局范围。这意味着,通常,在包含对eval的调用的函数中,每个不引用参数的名称或局部变量必须在运行时映射到特定的定义(因为该eval可能引入了一个新的隐藏外部变量的变量)。 在严格模式下,eval仅为正在评估的代码创建变量,因此eval不会影响名称是指外部变量还是某个局部变量 [强调添加]
另见本文:
答案 1 :(得分:5)
在 eval 代码中使用 let 和 const 并不会调用严格模式。 让和 const 为lexicalDeclarations,这将其范围限制在封闭的词汇范围内。
词汇范围由块创建并直接调用 eval (参见Runtime Semantics: PerformEva step 12)。