這可能是重複的,但我不知道如何搜索它。分配現有或空的對象
爲什麼
var test = test || {};
工作,但
var test = testing || {};
拋出一個錯誤?在定義時,test
和testing
都未定義。
編輯
拋出的錯誤是「引用錯誤:測試沒有定義」
這可能是重複的,但我不知道如何搜索它。分配現有或空的對象
爲什麼
var test = test || {};
工作,但
var test = testing || {};
拋出一個錯誤?在定義時,test
和testing
都未定義。
編輯
拋出的錯誤是「引用錯誤:測試沒有定義」
從不存在的意義上說,未定義的變量與保存值undefined
的變量之間存在差異。
在你的第一個例子中,你聲明test
與var
這樣,當在=
右側的表達式求值的變量test
存在,但有值undefined
。
在你的第二個例子中,你根本沒有定義testing
,因此錯誤。
編輯:它發生在我身上,也許進一步的解釋不會傷害。
爲了簡化,JavaScript引擎需要兩遍代碼。第一遍是解析/編譯階段,然後發生變量聲明但未分配。第二遍是實際執行,然後是分配發生。這導致了一種通常稱爲「變量提升」的效應 - 就好像JS引擎將聲明「提升」到其範圍的頂部,但仍然執行了任務。
這樣才能代碼這樣的地步:
var test = test || {};
...它基本上是說「難道test
已經與truthy值:如果有則使用它,否則將其設置爲一個新的空?目的。」如果相同的變量聲明不止一次在同一範圍內
JS引擎不介意 - 它基本上忽略了第二聲明,但不會忽略包含在第二個聲明任何分配。因此,如果test
在某個其他腳本塊中聲明,可能是在一個單獨的JS包含文件中,那麼該行只會將test
分配給它自己(假設它有一個真值,其中所有對象都是真實的)。但是,如果它沒有在別處聲明,它將仍然存在,因爲當前的var
聲明,但在當前賦值之前它將爲undefined
,因此||
運算符返回右側操作數{}
。
這是由於var
關鍵字。 因爲聲明瞭變量,所以它也存在,儘管值未定義。 ||
然後做的是檢查是否真實,當它發現對象未定義時,它會給你一個新的對象來處理。
後者完全相同,但由於您在「一行」上執行此操作,因此testing
對象在評估時未定義,因此會拋出異常。
var test = test || {};
這裏,test
一直declared
但不defined
但是,
var test = testing || {};
有沒有testing
任何引用,你還在試圖轉讓其價值。
對於第一種情況對應的代碼會是這樣,
var testing; // See testing is still undefined
var test = testing || {};
@MattLin:可是我沒有定義'test'要麼,還是我? – Amberlamps
+1好問題 – paragy
@nozzleman:什麼?只需複製並粘貼'var test = testing || {};'到您的控制檯。 – Amberlamps