2013-12-17 26 views
16

我一直在尋找的jQuery的代碼在過去的版本,並且似乎在每一個版本they have this line of code內某處:什麼是做window.undefined =點window.undefined

window.undefined = window.undefined; 

我不能看看爲什麼這個重要,更重要的是,這是做什麼的。這好像是將undefined指定爲undefined,這對我來說毫無意義。

但是,這似乎很重要,我很好奇。

+0

[通過jQuery核心源代碼中的未定義參數](http://stackoverflow.com/a/5395329/901048) – Blazemonger

+4

@Blazemonger不,我不這麼認爲。 –

+2

我認爲他們只是確保未定義的財產將存在。如果不是,則創建 –

回答

9

window.undefined並不總是存在,因此像if (foo === undefined)這樣的代碼會在舊版瀏覽器中引發ReferenceError,因爲undefined未定義(即未聲明)。此代碼只是確保undefined被定義(未定義)。

雖然這是不必要的,因爲有很多方法可以在沒有同名全局屬性的情況下獲得值undefined。例如,你可以寫if (foo === void 0)甚至像if (foo === [][0])

Later versions似乎認爲window.undefined存在於所有支持的瀏覽器中。該most recent versions使用這樣的模式:

(function(window, undefined) { 
    ... 
})(window); 

注意,沒有值傳遞爲undefined,所以它保證被聲明爲一個局部變量,並有undefined值。

+0

全局'undefined'變量在EcmaScript 3(§15.1.1.3)中被指定。瀏覽器是否沒有實現這一點,或者是否有早期版本沒有指定這個?哪些舊瀏覽器沒有全局的'undefined'變量? – Bergi

+1

@Bergi IIRC這是一箇舊的IE的東西。我現在試圖找到這方面的一些證據,但無法挖掘這些舊瀏覽器的信息。不過,我確實還記得幾年前遇到過這種情況。 –

+0

@Bergi我剛剛檢查了版本2,它似乎沒有在那裏指定。 IE在完全採用ES3方面遠遠落後於此,所以我懷疑它是他們。 –

1

使用這個,jQuery定義了一個全局變量,其值爲undefined。具有類似於myvar一個全局變量是指您在window範圍有這個變量(如window.mywar),如果你運行這段代碼在窗口範圍:

var myvar = "whatever"; 

JavaScript的定義你的變量,如果你有這條命令:

window.myvar = "whatever"; 

假設我們沒有一個全局變量像myundefined這意味着window.myundefined不存在,window.myundefined沒有價值,這意味着window.myundefined是真的undefined,那麼你可以創建一個全局variab樂在窗口範圍內這樣的命名undefined

window.undefined = window.myundefined 

這行有完全相同的結果爲你上面提到的jQuery代碼。換句話說jQuery的可以做同樣的與此代碼:

window.undefined = window.myundefined 

window.undefined = window.whatever_you_want_with_no_value 

這些定義都沒有值的全局變量。