Javascript 變數範圍 兩個可能會被忽略的小特性

來源:互聯網
上載者:User

也許有些高手早已知道了,但是我覺得這兩個東西還是有一些價值的,所以拿到這裡和大家分享一下吧
. 有如下代碼: 複製代碼 代碼如下:<script type="text/javascript" >
function test() {
with (location) {
var temp = "an url";
}
alert(temp);
}
test();
</script>

調用這個函數會輸出什麼呢? 也許會認為它會彈出undefined, 但實際上,它彈出的是"an url"這個字串,這就涉及到JavaScript中變數範圍的一個概念。
JS中,每個範圍都有一個相應的"變數對象"(這麼叫不一定準確,知道有這麼個東西就行了),這裡面存放著當前範圍定義的標識符。JS程式開始的時候,會進入全域範圍, 在我們的程式中,因為全域範圍中定義了test函數,所以它這裡的“變數對象”就存放了test函數的標識符。接下來,我們調用了test函數,就進入了,test函數的範圍,test函數本身的範圍也有自己的"變數對象",進入test的範圍的時候,也會把全域範圍裡存放的標識符複製進來,所以,在test函數中就可以訪問全域範圍中定義的標識符了,但是在外層範圍,是不能看到內層的內容的。如果這樣的話,那我們這裡的alert(temp)就會輸出undefined,因為temp是在內層範圍定義的。但是為什麼在這裡卻能夠找到在內層範圍裡定義的標識符呢?
因為with語句塊中範圍的"變數對象" 是唯讀,所以在他本層定義的標識符,不能儲存到本層,而是儲存到它的上一層範圍,也就是test函數的範圍,所以,我們的alert(temp)這條語句,就可以訪問到那個在內層定義的temp變數了。同樣的情形還出現在try catch 語句裡面。
.Javascript中沒有語句塊的概念,代碼如下: 複製代碼 代碼如下:if (true) {
var temp = "oh";
}
alert(temp);

很簡單的幾行代碼,如果是按照通常的程式語言經驗,我們會認為alert語句會報錯,然而事實並不是這樣,alert語句正常的輸出了“oh” 這個字串,所以在
Javascript中不存在語句塊的概念。
上面兩個樣本都很簡單,也許並不是多高的技術,很多高手應該早已瞭解,但是這兩個語言特性應該還是比較有用的,也許瞭解這些特性後,在寫JS的時候會減少一些出錯的機會,所以還是發上來和大家分享一下,希望能夠對大家寫JS的時候協助。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.