2016-09-14 91 views
1

我在教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範圍,我將不勝感激。

Breakpoint analysis in two browsers

UPDATE更新的版本?

已經有很多對提升有益的參考,我很欣賞的指針上命名的元素重複的問題。很有幫助。如果我可以跟進#2的子問題,是否有人對瀏覽器對範圍的非標準處理髮表了評論。看起來,Chrome至少可以區分超出範圍和懸掛但未宣佈。 IE不太具體。有什麼想法嗎?

+3

問題1是不是關於語言的一個特徵,它是關於一個[流行的瀏覽器非標準特性(http://stackoverflow.com/q/6381425/5743988) 。問題2似乎混淆了[提升](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/var#var_hoisting)。 – 4castle

+1

@ 4castle實際上問題1顯示_standard_行爲。我同意這是愚蠢的,但它實際上明確涵蓋了規格。它首先在IE中作爲非標準引入,然後作爲官方採用。大多數瀏覽器實際上都偏離了規範,因爲它們應該爲名稱屬性執行相同的操作,例如,但它們不會。只有ID似乎被添加到窗口對象。即使邊緣是這樣做,而不是IE瀏覽器 – vlaz

+0

也許這是一個好主意,介紹[''use strict;''](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Strict_mode) 。這會爲使用未定義的變量引發錯誤。 –

回答

-1

您的第一個發現對我而言也是新的,所以我會盡力解決您的第二個問題。

變量可以有兩種類型的範圍,即本地或全局。

函數內的所有變量都被認爲是局部變量。與許多其他編程語言不同,JavaScript沒有塊級的範圍。它只有功能級別範圍。

var appName = "Test"; // global variable 

function test(name){ // name is a local variable 
    var age = 20;  // age is a local variable 

    console.log(weight); // undefined 


    // Note that it does not throw an error saying "Uncaught ReferenceError: weight is not defined", 
    // This is because the variable is available but the value is not yet assigned. 
    // This is because of hoisting ie. all variables inside a function are hoisted (or lifted) to the top of the function 


    var weight = 10;  // Over here the value gets assigned 
} 

Another incredible article on Hoisting

+1

「與許多其他編程語言不同,JavaScript沒有塊級別的範圍。」 - https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Statements/let – Quentin