【问题标题】:Define const variable using eval()使用 eval() 定义 const 变量
【发布时间】:2017-04-03 15:36:10
【问题描述】:

当我尝试使用 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 上对其进行了测试。我错过了什么吗?

提前谢谢你!

【问题讨论】:

    标签: javascript node.js constants eval


    【解决方案1】:

    eval 代码中使用 letconst 不会调用严格模式。 letconstlexicalDeclarations,这将它们的范围限制在封闭的词法范围内。

    词法作用域是由块和直接调用 eval 创建的(参见Runtime Semantics: PerformEva step 12)。

    【讨论】:

      【解决方案2】:

      那是因为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("var x;") 将变量 x 引入到周围的函数或全局范围中。这意味着,一般来说,在包含对 eval 的调用的函数中,每个不引用参数或局部变量的名称必须在运行时映射到特定的定义(因为 eval 可能引入了一个新的隐藏外部变量的变量)。 在严格模式下,eval 只为正在评估的代码创建变量,因此 eval 无法影响名称是指外部变量还是某个局部变量 [强调]

      另见这篇文章:

      【讨论】:

      • 哦,有道理。谢谢!我会在几分钟内接受你的回答:)
      • 但在 eval 代码中使用 letconst 不会调用严格模式。
      猜你喜欢
      • 2018-09-26
      • 1970-01-01
      • 2011-09-16
      • 1970-01-01
      • 2019-06-12
      • 2015-10-19
      • 2016-11-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多