关于eval语句构造和删除

时间:2012-12-13 17:58:26

标签: javascript google-chrome

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

var x = 1;

alert(delete x); // false

eval('var y = 2');

alert(delete y); // true

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

1 个答案:

答案 0 :(得分:2)

From the Mozilla JS Docs for 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)

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

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

关于eval古怪的其他文章:


编辑0

基于@Xavier Holt的评论,我查看了eval的悬挂和范围。 This scope cheatsheet from Mozilla Dev docs有以下内容:

  

eval可能会捕获分配,但不会捕获var声明

      eval'd vars正常提升,因此evals可能捕获类似的任务   与:

function f() {   {
    let x = "inner";
    eval("var x = 'outer'");
    print(x); // "outer"   } 
}

如果我正确地读到这个,那么我之前的假设是正确的。 eval()未通过声明变量来评估var声明。它必须创建属性或被视为属性才能使delete起作用。