6

请考虑以下代码段(此处为小提琴):

​var a;

​a = 1;
console.log(delete a​); // prints 'false'

​b = 1;
console.log(delete b);​ // prints 'true'​​​​

为什么delete关键字在全局变量a和上的行为不同b

4

4 回答 4

4

来自 MDN 文档

删除操作符从对象中删除一个属性。

全局变量(不带var)是全局对象(通常是window)的属性,因此可以删除。

Avar不是全局变量,而是外部范围内的局部变量——不是全局对象的属性——所以delete不会删除它。从那些文档中:

x = 42;     // creates the property x on the global object
var y = 43; // declares a new variable, y

delete x;   // returns true  (x is a property of the global object and can be deleted)
delete y;   // returns false (delete doesn't affect variable names)
于 2012-09-14T23:32:36.353 回答
3

MDN 说只有当属性存在并且不能被删除时,delete 才会返回 false。它在所有其他情况下返回 true。删除后,尝试测试实际值。你会看到它a没有被删除。这是因为,正如 MDN 页面所说,delete不会影响变量名。

它对变量或函数名称没有影响。

(即,使用全局对象定义var而不脱离全局对象)

查看下一页上的示例。 https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/delete

于 2012-09-14T23:32:49.807 回答
2

来自关于 var 的 Mozilla 文档

不同之处在于声明的变量是全局对象的不可配置属性,而未声明的变量是可配置的。

var a;--> 这是一个声明的变量,因为你使用的是var,所以它是不可配置的。

a = 6;--> 这是一个未声明的变量,因为你没有使用var,所以它是可配置的。

上面的两种语法都会以一个名为aattach 的 var 作为全局对象的属性结束(window通常),并且 properties 具有以下属性:

  • 可写。如果为 false,则无法更改该属性的值。
  • 可配置。如果为 false,则任何删除属性或更改其属性(可写、可配置或可枚举)的尝试都将失败。
  • 可枚举的。如果为 true,则当用户执行 for (var prop in obj){} (或类似)时,该属性将被迭代。

它是从ecmascript5 对象和属性中提取的,正如您所读到的,所讨论的变量的configurable属性会影响该变量是否可以被删除。

于 2012-09-14T23:56:37.250 回答
0

“var a”表示无法从当前块之外的任何地方访问它,因此删除它意味着UNDECLARE(与未定义不同),从而允许在同一块中再次写入“var a”(错误)

允许的用法(MDN):

delete object.property 
delete object['property'] 
delete object[index] 
delete property

这就像 GOTO 和非结构化编程,您可能需要手动清理资源,它有点像 C 中的 ~Destructor(虽然不一样)。你可以删除一个像 ~a(); 这样的对象。但你不能像“int i”那样“'UNDECLARE'一个变量”。

于 2012-09-27T13:07:38.637 回答