2013-10-16 47 views
3

請看下面的JS代碼:未聲明的變量自動撿DOM對象

alert(myImgId.src); 

和相應的HTML:

<img id="myImgId" src="http://images4.wikia.nocookie.net/__cb20121128141533/logopedia/images/6/6f/Superman_logo.png"></img> 

我想到會發生: 一個指定它的JavaScript錯誤找不到變量myImgId,基本上是一種NPE,同時訪問myImgId的對象src

實際發生了什麼: 現代瀏覽器(上面的FF 17 &,chrome)自動獲取給定ID的DOM元素。 舊版本的瀏覽器(如FF 10)會按預期拋出錯誤。

有人可以解釋這裏發生了什麼嗎?

JSFiddle link

+0

可能重複[從JS IDS自動創建的變量?(http://stackoverflow.com/questions/7114956/automatically-created-variables-from-ids-in-js) – Alnitak

+0

OOW,我做知道這是可能的。我在歌劇,鉻,即(9,10,沒有8 atm)測試,並完美地工作。 – Misters

+1

這是在HTML5標準 - 請參閱http://www.whatwg.org/specs/web-apps/current-work/#named-access-on-the-window-object – Alnitak

回答

-1

我的猜測是:

因爲你沒跟var聲明變量,它被看作是一個全局變量(全局到整個窗口),瀏覽器會自動掛鉤起來,因爲ID與對象名稱相同。

+4

不只是猜測 - _明顯ID正被自動添加到'window'。 OP需要的是DOM規範中對此的引用。 – Alnitak

+0

這裏它是 - http://www.whatwg.org/specs/web-apps/current-work/#named-access-on-the-window-object – Alnitak

2

我收集這從另一個SO問題,這個問題是不是真的一樣你的問題,但答案不會回答你的問題:

Can I Use an ID as a Variable Name?

,這裏是好東西:(所有報價從Sidnicious的回答)

使全局變量自動被認爲是不好的做法 ,因爲它可能很難說,看一些代碼,無論 是有意的還是你˚F或者在某處聲明一個變量。自動 像這樣的全局變量的創建在ES5嚴格模式 中不起作用,並且可能會在ECMAScript的未來版本中逐步淘汰。

在瀏覽器中JavaScript的全局範圍實際上是窗口。當你 參考文件你得到window.document。在瀏覽器中創建 一個全局變量,最好的做法是將其添加到窗口(全球在 Node.js的)....

......事實證明,大多數瀏覽器創建窗口的屬性(因此 全球變量)爲文檔中的每個ID。許多瀏覽器都不會讓它們成爲只讀文件,您可以用自己的文件覆蓋它們,但是Internet Explorer不會。

這是JavaScript中的全局變量可能很危險的另一個原因 - 您的某個ID可以匹配只讀窗口屬性(今天或某個未來瀏覽器的 )。

+0

這應該是一個評論,而不僅僅是一個副本和粘貼另一個人的答案(儘管它被記入) – Alnitak