2012-09-14 25 views
6

請考慮下面的代碼片段(小提琴here):不同的行爲刪除關鍵字的

​var a; 

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

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

爲什麼delete關鍵字的行爲不同的全局變量ab

+1

MDN表示只有屬性存在且不能刪除才返回false。它在所有其他情況下返回true。刪除後,嘗試測試實際值。你會看到'a'沒有被刪除。 – jeremy

+1

@尼爾:是的,行爲是不同的。我不明白這是怎麼解釋的。 – Randomblue

+0

它的行爲不同_因爲它被定義爲_?你還想要什麼? – Eric

回答

4

From the MDN docs

delete運算符從刪除的對象的屬性。

全局變量(不var)是全局對象(通常爲window)上的屬性,因此可以刪除。

A 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) 
+1

聲明和未聲明的全局變量都是全局對象的屬性。它們僅根據「可配置」屬性的值而有所不同。欲瞭解更多信息,請參閱:http://stackoverflow.com/a/16007360/1306809 –

4

MDN說刪除只有屬性存在,不能刪除時返回false。它在所有其他情況下返回true。刪除後,嘗試測試實際值。你會看到a未被刪除。這是因爲,如MDN頁面所示,delete不會影響變量名稱。

它對變量或函數名稱沒有影響。

(即,與var和不脫全局對象定義)

看看下頁的例子。 https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/delete

+0

呃...爲什麼投票呢? – jeremy

+0

有一個upvote彌補它 – Eric

+0

這樣一個美好的社區。你也是@Eric – jeremy

2

mozilla docs about var

不同的是,聲明的變量是全局對象的非可配置的屬性,而沒有標明的是可配置的。

var a; - >這是一個聲明的變量,因爲您使用的是var,所以它是不可配置的。

a = 6; - >這是一個未聲明的變量,因爲您沒有使用var,所以它是可配置的。上述

兩種語法將結束與一個名爲a附加爲全局對象(通常window)和屬性的屬性變種具有以下屬性:

  • 可寫。如果爲false,則該屬性的值不能更改。
  • 可配置。如果爲false,則任何嘗試刪除該屬性或更改其屬性(可寫,可配置或可枚舉)都將失敗。
  • 可枚舉數。如果爲true,那麼當用戶爲(var prop in obj){}(或類似){}進行迭代時,該屬性將被迭代。

是從ecmascript5 objects and properties提取,你可以閱讀,有問題的變量的configurable屬性會影響變量是否可以或不可以被刪除。

+1

+1這是問題的最佳答案。接受的答案並不完全準確。 –

0

「VAR一個」意味着它不能被從任何地方當前塊的外部訪問,從而刪除它平均UNDECLARE(未一樣未定義),從而允許在相同的再次寫入「一個變種」塊(錯誤)。

允許的用途(MDN):

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

這就像GOTO和非結構化的編程,你可能需要手動清理資源,這是種〜析構函數在C(雖然不一樣)。你可以刪除一個對象,如〜a();但是你不能像'int i'那樣''UNDECLARE'變量'。