6

在全局上下文中执行以下代码:

var x = 1;
y = 1
delete x //false
delete y //true

两者都是全局对象xy属性。为什么javascript必须在某种程度上区分它们?


按照 ES5 标准操作符对象内部方法delete套路很容易遵循。[[delete]]

表达的更明确的问题是,为什么它们采用不同的[[configurable]]属性?

4

1 回答 1

5

查看kangax这个相关问题中的第二个答案。

var x = 1 在当前作用域(又称执行上下文)中声明变量 x。如果声明出现在函数中 - 声明局部变量;如果它在全局范围内 - 声明全局变量。

另一方面,x = 1 仅仅是一个属性赋值。它首先尝试根据作用域链解析 x。如果它在该范围链中的任何位置找到它,它就会执行分配;如果它没有找到 x,那么它只会在全局对象(它是作用域链中的顶级对象)上创建 x 属性。

现在,请注意它没有声明全局变量,而是创建了一个全局属性。

两者之间的区别是微妙的并且可能会令人困惑,除非您了解变量声明也会创建属性(仅在变量对象上)并且 Javascript(嗯,ECMAScript)中的每个属性都有某些描述其属性的标志 - ReadOnly、DontEnum 和 DontDelete .

由于变量声明创建带有 DontDelete 标志的属性,因此 var x = 1 和 x = 1(在全局范围内执行时)之间的区别在于前者 - 变量声明 - 创建了 DontDelete'able 属性,而后者没有。因此,通过这种隐式赋值创建的属性可以从全局对象中删除,而前一个 - 通过变量声明创建的属性 - 不能。

于 2013-07-03T08:04:53.613 回答