【问题标题】:Javascript Why can't use let inside eval()Javascript 为什么不能在 eval() 中使用 let
【发布时间】:2021-05-19 00:30:23
【问题描述】:

我希望有人告诉我为什么 Javascript 在我这样做时不会抱怨:

    eval("x = 1");
    console.log(x);

output: 1

...但是,如果我这样做,它会抱怨:

    eval("let x=1");
    console.log(x);

output:
> ReferenceError: x is not defined

谢谢。 注意:我知道使用 eval 是不好的,严重的安全风险,等等,谢谢你。我只是想了解这背后的理论。

【问题讨论】:

  • 抱怨什么?我可以在浏览器控制台中运行 eval("let x = 1") 就好了。
  • 它不适合我
  • 添加错误信息,没有适当的反馈我们怎么知道?
  • “当我这样做时它会抱怨”:它抱怨什么?发布错误消息。
  • @KingDavid 最后检查我答案的更新部分。 Let 的作用域是 eval 函数

标签: javascript node.js eval


【解决方案1】:

编辑:既然您已经更新了您的问题,我可以提供更具体的帮助。

原因

eval("let x = 1");
console.log(x);

不起作用是因为let 是其范围的本地。您无法访问eval 范围之外的变量。

您需要使用var 使变量全局可访问。

To quote MDN:

let 允许您声明仅限于块语句或使用它的表达式的范围的变量,这与 var 关键字不同,它在全局或本地声明一个变量,而不考虑块范围。

你原来的、未经编辑的问题不起作用的原因是你在分配变量时没有实际对它做任何事情。

eval("var x = 1"); // Undefined
eval("const x = 1"); // Undefined
eval("let x = 1"); // Undefined

现在,如果你给它一些东西吐出来:

eval("var x = 1; x"); // 1
eval("const x = 1; x"); // 1
eval("let x = 1; x"); // 1

至少它在我的 chromium 控制台中是这样工作的。

我的看法是,在第一个示例中,您只是在评估语句 x = 1 的响应。

但是,它在评估时没有返回响应,因为没有返回响应。

这只是一个任务。您是在告诉 eval 有一个名为 x 的变量,而您是在告诉它它的值为 1,但您并没有告诉它如何处理该变量。

这相当于您创建以下内容:

doNothing.js

let x = 1;

如果你运行这个程序,它不会向控制台输出任何东西,因为它所做的只是给x赋值。

【讨论】:

  • 我会等待关于应该是什么的澄清“抱怨”
  • 他刚刚澄清了。这就是我认为他的意思!
  • 不是真正的错误,但我认为他在谈论@Cid
  • 不用担心。我进行了一些编辑,因此请确保您刷新以查看最新版本。如果您发现这有帮助,请务必将我的答案标记为正确。祝你好运@KingDavid
  • 它不起作用的原因是let 被限定为 eval。本质上,您无法在 @KingDavid 范围内的块之外使用 let 访问变量
猜你喜欢
  • 2019-07-04
  • 2018-01-06
  • 2016-03-26
  • 1970-01-01
  • 2011-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-14
相关资源
最近更新 更多