我在教CS的本科課程,我選擇Javascript作爲一種語言,因爲它重量輕。我試圖編寫代碼並對它進行測試,以作爲我所有講座的基礎。今天我發現我沒有正確理解我自己代碼的輸出。我曾經想過,因爲JavaScript在語法上與許多其他語言類似,所以它會處理像這些語言一樣的範圍。顯然不是。我有一些古怪的東西,我希望有人能夠解釋。下面是整個代碼。使用Javascript解釋範圍
<html>
<script>
function loadme()
{
contents.innerHTML="See this?";
contents = 7;
var tents = 7;
other();
}
function other()
{
var otherTents = 7;
}
</script>
<body onload="loadme()">
<p id="contents"></p>
</body>
</html>
問題1.顯然,第一行loadme中的標識符內容是指帶有該id的p標記。這在瀏覽器中似乎是一致的,並且表明有一個自動生成的變量集合對應於頁面上所有HTML標籤的ID。我甚至不知道這是可能的。如果不是讓事情更混亂,我可以用任何值覆蓋變量,因爲JavaScript不是強類型的。如果任何人有一個參考更充分地解釋這種語言的功能,我將不勝感激。
問題2.雖然變量tents直到第5行才被聲明,但如果我在第一行檢查代碼,它將顯示在範圍內(即使該值未定義)。這不是特別有用。我最初認爲這意味着變量不在範圍內。現在將其與Chrome中顯示爲「不可用」的otherTents變量進行比較。那麼帳篷可用? IE沒有幫助說帳篷=未定義,而其他帳篷未定義。再次,如果任何人有一個有用的參考解釋了什麼是在Javascript範圍,我將不勝感激。
UPDATE更新的版本?
已經有很多對提升有益的參考,我很欣賞的指針上命名的元素重複的問題。很有幫助。如果我可以跟進#2的子問題,是否有人對瀏覽器對範圍的非標準處理髮表了評論。看起來,Chrome至少可以區分超出範圍和懸掛但未宣佈。 IE不太具體。有什麼想法嗎?
問題1是不是關於語言的一個特徵,它是關於一個[流行的瀏覽器非標準特性(http://stackoverflow.com/q/6381425/5743988) 。問題2似乎混淆了[提升](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/var#var_hoisting)。 – 4castle
@ 4castle實際上問題1顯示_standard_行爲。我同意這是愚蠢的,但它實際上明確涵蓋了規格。它首先在IE中作爲非標準引入,然後作爲官方採用。大多數瀏覽器實際上都偏離了規範,因爲它們應該爲名稱屬性執行相同的操作,例如,但它們不會。只有ID似乎被添加到窗口對象。即使邊緣是這樣做,而不是IE瀏覽器 – vlaz
也許這是一個好主意,介紹[''use strict;''](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Strict_mode) 。這會爲使用未定義的變量引發錯誤。 –