ECMAScript里关于delete操作符的解释晦涩的很, 实在不是我能理解的. 有兴趣你可以去看看.

实际中使用中, 经常会碰到Javascript变量有时候能成功删除, 有时候却不掉成功删除的情况.
这篇Understanding delete牛文详细解释了, 为什么会这样, 什么样的变量能成功delete, 什么样的不能成功delete.

简而言之, 就是通过”声明“方式创建的变量不能成功删除, 通过”赋值“方式创建的变量能成功删除; 一但一个变量创建后, 它能不能被删除的属性将不会改变. 一个特例是通过eval()函数执行动态代码创建出来的变量,都是可以删除的.
如下面这段代码在Firefox/Chrome/Nodejs里的运行结果如下:

(function(global){
    var aaa = "aaa";
    bbb = "bbb";
    global.ccc = "ccc";
    eval("var ddd='ddd';");
    console.log(delete aaa);
    console.log(delete bbb);
    console.log(delete ccc);
    console.log(delete ddd);
}(this));

scrn2011-12-31 12 04 18

Firebug的console里直接定义的变量(不包括在函数里定义的变量), 似乎是因为以eval()的方式在运行代码. 所以通过在Firebug的console里输入代码创建出来的变量,是可以删除的. Chrome等webkit系的浏览器的开发工具没有这个问题. 这一点在调试代码时可能会引起奇怪的现象.

//在console里粘贴运行下面的代码
var aaa = "aaa";
console.log(delete aaa); 
//在Chrome的开发工具里返回是false, 在Firebug的console里返回是true.

scrn2011-12-31 12 13 13

    共享到:

相关文章