Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/404.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript delete关键字在全局变量上的不同行为 请考虑下面的片段(小提琴):_Javascript - Fatal编程技术网

Javascript delete关键字在全局变量上的不同行为 请考虑下面的片段(小提琴):

Javascript delete关键字在全局变量上的不同行为 请考虑下面的片段(小提琴):,javascript,Javascript,为什么delete关键字在全局变量a和b上的行为不同?: “删除”操作符从对象中删除属性 全局变量(不带var)是全局对象(通常是窗口)上的属性,因此可以删除 var不是全局变量,而是外部范围中的局部变量-不是全局对象的属性-因此delete不会删除它。从这些文件中: x = 42; // creates the property x on the global object var y = 43; // declares a new variable, y delete x; /

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

“删除”操作符从对象中删除属性

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

var
不是全局变量,而是外部范围中的局部变量-不是全局对象的属性-因此
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)

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

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

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

请看下一页上的示例。

来自:

区别在于声明的变量是全局对象的不可配置属性,而未声明的是可配置属性

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

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

上述两种语法都将以名为
a
的var作为全局对象的属性(
window
通常)结束,并且属性具有以下属性:

  • 可写。如果为false,则无法更改属性的值
  • 可配置。如果为false,则任何删除属性或更改属性(可写、可配置或可枚举)的尝试都将失败
  • 可枚举。如果为true,则当用户执行for(obj中的var prop){}(或类似操作)时,将迭代该属性
这是从变量的
configurable
属性中提取出来的,正如您所读到的,该变量的
属性会影响该变量是否可以被删除。

“var a”表示不能从当前块之外的任何地方访问它,因此删除它将意味着未声明(与未定义的属性不同),从而允许写入同一块中再次出现“var a”(错误)

允许使用(MDN):


就像GOTO和非结构化编程一样,您可能需要手动清理资源,它类似于C语言中的~Destructor(尽管不同)。您可以删除~a()之类的对象;但不能“取消声明”变量,如“int i”“

MDN表示仅当属性存在且无法删除时才返回false。它在所有其他情况下都返回true。删除后,尝试测试实际值。你会看到
a
没有被删除。@Nile:是的,行为是不同的。我不明白这是怎么解释的。它的行为不同,因为它被定义为?你还想要什么?@Eric:也许可以解释一下为什么它被定义为?声明的和未声明的全局变量都是全局对象的属性。它们仅根据
configurable
属性的值而不同。有关更多信息,请参阅:+1这是该问题的最佳答案。公认的答案并不完全准确。
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)
delete object.property 
delete object['property'] 
delete object[index] 
delete property