3

我正在阅读有关 Javascript方法的这篇文章delete,并尝试了以下代码:

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";,文章声称这是你如何使属性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();

在 take 1 中,globalx是窗口的一个属性,但它仍然不可删除。是否delete成功的标准不是变量是否是某物的属性(始终为真),而是该属性是否具有DontDelete属性集。

4

3 回答 3

2

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

y解析为window对象的属性。

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

删除表达式

其中表达式应计算为属性引用

于 2012-11-03T17:58:22.890 回答
1

JavaScript中的变量是使用var关键字声明的。当您省略var时,解释器开始寻找定义给定变量的最近范围。如果未找到给定变量,它将作为全局对象上的新属性创建

这正是这里发生的事情:

  • 变量y被引用并分配了一个新值 ( abcd)
  • Vary没有在任何地方定义 → 新的全局属性y被创建并赋值(有效地window.y = "abcd")。
  • 结果,y成为全局对象的属性,可以删除。
于 2012-11-03T17:58:38.267 回答
1

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

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

现在很明显发生了什么。

如果您不使用var关键字,则解释器假定该变量是全局对象的属性(通常是window),如此 JSFiddle所示。注意在全局范围内,this是和window对象一样的。

回复:更新:

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

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

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

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

于 2012-11-03T18:13:48.513 回答