定义无法删除的属性?

时间:2012-04-02 17:08:30

标签: javascript scope ecmascript-5 spidermonkey

如果我在使用Spidermonkey 1.8的JSDB 1.8中这样做:

 this.x = 3;
 var y = 4;
 function z() { return 77; }
 this.w = function w() { return 44; }
 this.v = function v() { return 55; }
 w = function w() { return 66; }
 function v() { return 77; }
 delete x;
 delete y;
 delete z;
 delete w;
 delete v;

我从truedelete x行获得delete w,但来自falsedelete y以及delete z的{​​{1}}线。

这里发生了什么,这种行为是在ECMAscript标准中还是在Spidermonkey中定义的?我想从特定范围中删除一个函数,发现我不能。

3 个答案:

答案 0 :(得分:1)

在此处阅读删除的详细说明  http://perfectionkills.com/understanding-delete/

答案 1 :(得分:1)

描述此行为的另一个好方法是来自MDN https://developer.mozilla.org/en/JavaScript/Reference/Operators/delete

表示无法删除在全局命名空间中使用var关键字定义的变量。

但是如果您使用的是javascript 1.8.5,那么您可以使用Object的defineProperty方法创建可以通过设置可配置选项删除的属性

https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/defineProperty

答案 2 :(得分:0)

正如Helmus发布的链接所解释的那样,从广义上讲(这个领域有一些跨浏览器的怪癖,正如文章所讨论的那样),变量不能删除,但属性可以。

请注意,在全局范围中,未使用var关键字声明的变量被视为全局对象的属性。所以:

var global_var1 = 'some val';
global_var2 = 'some val';
delete global_var1; //false
delete global_var2; //true
typeof global_var1; //'string'
typeof global_var2; //'undefined'