我正在使用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
属性。
答案 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
)y
未在任何地方定义→创建新的全局属性y
并为其分配值(有效window.y = "abcd"
)。y
成为全局对象的属性,可以将其删除。答案 2 :(得分:1)
以下是第二个示例的扩展版本:
window.y = "abcd";
console.log(delete window.y);
现在很明显发生了什么。
如果不使用var
关键字,解释器会假定变量是全局对象的属性(通常为window
),如this JSFiddle所示。请注意,在全局范围内,this
与window
对象相同。
回复:更新:
在函数外部,使用var
声明的变量被定义为全局对象的不可配置属性。这在https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Statements/var中有详细说明,其中包含:
在函数外部使用
var
是可选的;为未声明的变量赋值会隐式将其声明为全局变量(也是全局对象的属性)。不同之处在于声明的变量是全局对象的不可配置属性,而未声明的变量是可配置的。
在函数内声明变量不会将其分配给全局属性,而是将其分配给局部变量。
这解释了在全局范围内定义变量时所看到的行为。