Javascript 为什么不能在 eval() 中使用 let

Javascript Why can't use let inside eval()

我希望有人能告诉我为什么 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");
console.log(x);

不起作用是因为 let 在其范围内。您不能访问 eval.

范围之外的变量

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

To quote MDN:

let allows you to declare variables that are limited to the scope of a block statement, or expression on which it is used, unlike the var keyword, which declares a variable globally, or locally to an entire function regardless of block scope.

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

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.

的响应

但是,在评估的时候没有return回应,因为return没有回应。

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

这相当于你创建了以下内容:

doNothing.js

let x = 1;

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

赋值