2013-07-03 17 views
6

在全球範圍內執行的代碼如下:爲什麼javascript在刪除時區分有或沒有聲明的賦值?

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

兩個xy是全局對象的屬性。爲什麼JavaScript必須在某種程度上區分它們?


這很容易按套路accoring到ES5標準the delete operatorthe object internal method[[delete]]

表達的問題更清晰的是爲什麼不同[[configurable]]屬性他們採用?

+0

@FelixKling嗨,再次見到你!但我不明白他們爲什麼具有不同的[[可配置]]屬性。你知道我讀了標準,但沒有找到任何證據。這種決定是由什麼驅動的? – yuan

+0

嗯,我不能告訴你,我沒有做出這個決定:)也許你應該聯繫使用ECMAScript標準的人。 –

回答

5

請看this related question的第二個答案kangax

var x = 1聲明當前作用域中的變量x(又名執行 上下文)。如果聲明出現在函數中 - 局部變量是 聲明;如果它在全局範圍內 - 聲明全局變量。

另一方面,x = 1僅僅是屬性分配。它首先 嘗試解決範圍鏈的x。如果它發現它在 範圍鏈中的任何地方,它將執行分配;如果它沒有找到x,則只有 然後它會在全局對象(這是作用域鏈中的頂級 對象)上創建x屬性。

現在請注意,它沒有聲明全局變量,它創建了一個 全局屬性。

兩者之間的區別是很微妙的,可能會造成混淆,除非你 明白變量聲明還(僅適用於 一個變量對象)創建屬性並在Javascript中的每個屬性(當然, 的ECMAScript)具有描述的某些標誌的屬性 - ReadOnly,DontEnum和DontDelete。

由於變量聲明與DontDelete標誌產生的性質,x = 1和x = 1(當在全局範圍內執行) 是前者VAR之間的差 - 變量聲明 - 創建DontDelete'able 性,後者一個沒有。因此,通過此隱式賦值創建的屬性 可以從全局對象 中刪除,而前一個 - 通過變量聲明創建的一個 - 不能。

+0

這也記錄在這裏https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/delete – elclanrs

相關問題