关于eval语句构造和删除

Lor*_*ard 5 javascript google-chrome

如果我在谷歌Chrome控制台中运行以下代码,我会得到以下结果

var x = 1;

alert(delete x); // false
Run Code Online (Sandbox Code Playgroud)
eval('var y = 2');

alert(delete y); // true
Run Code Online (Sandbox Code Playgroud)

为什么在第一个例子中没有删除变量,在第二个例子中它被删除了?

JSu*_*uar 2

来自 Mozilla JS 文档delete

delete仅对对象的属性有效。它对变量或函数名称没有影响。

提供的示例与您的类似。

x = 42;         // creates the property x on the global object
var y = 43;     // declares a new variable, y

delete x;       // returns true  (x is a property of the global object and can be deleted)
delete y;       // returns false (delete doesn't affect variable names)
Run Code Online (Sandbox Code Playgroud)

那么,为什么alert(delete y);有效呢?我无法确定确切的答案,但基本上你不能依赖 eval 的范围。

我认为eval('var y = 2');没有被声明为变量并被视为属性,但除了我们的测试结果之外,我还没有找到证据。我将继续研究,看看是否能找到确切的原因。

其他关于eval怪异的文章:


编辑0

根据 @Xavier Holt 的评论,我查找了有关eval. Mozilla Dev 文档中的范围备忘单包含以下内容:

eval 可以捕获赋值,但不能捕获 var 声明

eval'd vars 通常会提升,因此 evals 可能会捕获类似于以下的赋值:

function f() {   {
    let x = "inner";
    eval("var x = 'outer'");
    print(x); // "outer"   } 
}
Run Code Online (Sandbox Code Playgroud)

如果我正确地阅读了这篇文章,那么我之前的假设是正确的。eval()var通过声明变量来评估声明。它必须创建财产或被视为财产才能delete发挥作用。