非属性分配变量是可删除的

时间:2012-11-03 17:56:37

标签: javascript properties attributes

我正在使用Javascript delete方法阅读this article,并尝试了以下代码:

function f(){
    var x = "abcd";
    console.log(delete x); //returns false, because x has DontDelete attribute
    y = "abcd";
    console.log(delete y); //returns true, but I didn't explicitly assign y as a property
}

这很奇怪,因为我没有使用y的属性分配(如:window.y="abcd";),文章claims就是你如何使属性delete能够。

为什么y没有DontDelete属性?

更新

在下面的答案中,声称y是可删除的仅仅因为它是window对象的属性。事实并非如此。请考虑以下代码段:

function f() {
    var functionx = "abcd";
    console.log(delete functionx); //returns false, because x has DontDelete attribute
    functiony = "abcd";
    console.log(delete functiony); //returns true, but I didn't explicitly assign functiony as a property to the window
}

//take 1
var globalx = "abcd";
console.log(this.globalx);//to prove x is a property of the global
console.log(delete globalx);//fails, even though x is a property of the window

//take 2
this.globaly = "abcd";
console.log(this.globaly);//to prove y is a property of the global
console.log(delete globaly);//succeeds, because I used property assignment

f();

在第1步中,globalx是窗口的属性,但仍然无法删除。 delete是否成功的标准不是变量是否是某个属性(总是为真),而是该属性是否设置了DontDelete属性。

3 个答案:

答案 0 :(得分:2)

delete x无效,因为它无法解析为任何对象属性。

y解析为window对象的属性。

https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/delete

  

删除表达式

     

其中表达式应评估为属性引用

答案 1 :(得分:1)

JavaScript are declared using var keyword中的变量。省略var时,解释器开始查找定义给定变量的最近范围。如果找不到给定变量,it will be created as a new property on a global object

这正是这里发生的事情:

  • 引用变量y并为其分配新值(abcd
  • Var y未在任何地方定义→创建新的全局属性y并为其分配值(有效window.y = "abcd")。
  • 因此,y成为全局对象的属性,可以将其删除。

答案 2 :(得分:1)

以下是第二个示例的扩展版本:

window.y = "abcd";
console.log(delete window.y);

现在很明显发生了什么。

如果不使用var关键字,解释器会假定变量是全局对象的属性(通常为window),如this JSFiddle所示。请注意,在全局范围内,thiswindow对象相同。

回复:更新:

在函数外部,使用var声明的变量被定义为全局对象的不可配置属性。这在https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Statements/var中有详细说明,其中包含:

  

在函数外部使用var是可选的;为未声明的变量赋值会隐式将其声明为全局变量(也是全局对象的属性)。不同之处在于声明的变量是全局对象的不可配置属性,而未声明的变量是可配置的。

在函数内声明变量不会将其分配给全局属性,而是将其分配给局部变量。

这解释了在全局范围内定义变量时所看到的行为。

相关问题