Javascript 變量作用域 兩個可能會被忽略的小特性
更新時間:2010年03月23日 22:56:43 作者:
關(guān)于Javascript,大家肯定都很熟悉啦,對于有編程經(jīng)驗的朋友來說,Javascript很快就能上手,不過關(guān)于JS的變量作用域,還是有一點(diǎn)差別的。
也許有些高手早已知道了,但是我覺得這兩個東西還是有一些價值的,所以拿到這里和大家分享一下吧
. 有如下代碼:
<script type="text/javascript" >
function test() {
with (location) {
var temp = "an url";
}
alert(temp);
}
test();
</script>
調(diào)用這個函數(shù)會輸出什么呢? 也許會認(rèn)為它會彈出undefined, 但實(shí)際上,它彈出的是"an url"這個字符串,這就涉及到JavaScript中變量作用域的一個概念。
JS中,每個作用域都有一個相應(yīng)的"變量對象"(這么叫不一定準(zhǔn)確,知道有這么個東西就行了),這里面存放著當(dāng)前作用域定義的標(biāo)識符。JS程序開始的時候,會進(jìn)入全局作用域, 在我們的程序中,因為全局作用域中定義了test函數(shù),所以它這里的“變量對象”就存放了test函數(shù)的標(biāo)識符。接下來,我們調(diào)用了test函數(shù),就進(jìn)入了,test函數(shù)的作用域,test函數(shù)本身的作用域也有自己的"變量對象",進(jìn)入test的作用域的時候,也會把全局作用域里存放的標(biāo)識符復(fù)制進(jìn)來,所以,在test函數(shù)中就可以訪問全局作用域中定義的標(biāo)識符了,但是在外層作用域,是不能看到內(nèi)層的內(nèi)容的。如果這樣的話,那我們這里的alert(temp)就會輸出undefined,因為temp是在內(nèi)層作用域定義的。但是為什么在這里卻能夠找到在內(nèi)層作用域里定義的標(biāo)識符呢?
因為with語句塊中作用域的"變量對象" 是只讀的,所以在他本層定義的標(biāo)識符,不能存儲到本層,而是存儲到它的上一層作用域,也就是test函數(shù)的作用域,所以,我們的alert(temp)這條語句,就可以訪問到那個在內(nèi)層定義的temp變量了。同樣的情形還出現(xiàn)在try catch 語句里面。
.Javascript中沒有語句塊的概念,代碼如下:
if (true) {
var temp = "oh";
}
alert(temp);
很簡單的幾行代碼,如果是按照通常的程序語言經(jīng)驗,我們會認(rèn)為alert語句會報錯,然而事實(shí)并不是這樣,alert語句正常的輸出了“oh” 這個字符串,所以在
Javascript中不存在語句塊的概念。
上面兩個示例都很簡單,也許并不是多高的技術(shù),很多高手應(yīng)該早已了解,但是這兩個語言特性應(yīng)該還是比較有用的,也許了解這些特性后,在寫JS的時候會減少一些出錯的機(jī)會,所以還是發(fā)上來和大家分享一下,希望能夠?qū)Υ蠹覍慗S的時候幫助。
. 有如下代碼:
復(fù)制代碼 代碼如下:
<script type="text/javascript" >
function test() {
with (location) {
var temp = "an url";
}
alert(temp);
}
test();
</script>
調(diào)用這個函數(shù)會輸出什么呢? 也許會認(rèn)為它會彈出undefined, 但實(shí)際上,它彈出的是"an url"這個字符串,這就涉及到JavaScript中變量作用域的一個概念。
JS中,每個作用域都有一個相應(yīng)的"變量對象"(這么叫不一定準(zhǔn)確,知道有這么個東西就行了),這里面存放著當(dāng)前作用域定義的標(biāo)識符。JS程序開始的時候,會進(jìn)入全局作用域, 在我們的程序中,因為全局作用域中定義了test函數(shù),所以它這里的“變量對象”就存放了test函數(shù)的標(biāo)識符。接下來,我們調(diào)用了test函數(shù),就進(jìn)入了,test函數(shù)的作用域,test函數(shù)本身的作用域也有自己的"變量對象",進(jìn)入test的作用域的時候,也會把全局作用域里存放的標(biāo)識符復(fù)制進(jìn)來,所以,在test函數(shù)中就可以訪問全局作用域中定義的標(biāo)識符了,但是在外層作用域,是不能看到內(nèi)層的內(nèi)容的。如果這樣的話,那我們這里的alert(temp)就會輸出undefined,因為temp是在內(nèi)層作用域定義的。但是為什么在這里卻能夠找到在內(nèi)層作用域里定義的標(biāo)識符呢?
因為with語句塊中作用域的"變量對象" 是只讀的,所以在他本層定義的標(biāo)識符,不能存儲到本層,而是存儲到它的上一層作用域,也就是test函數(shù)的作用域,所以,我們的alert(temp)這條語句,就可以訪問到那個在內(nèi)層定義的temp變量了。同樣的情形還出現(xiàn)在try catch 語句里面。
.Javascript中沒有語句塊的概念,代碼如下:
復(fù)制代碼 代碼如下:
if (true) {
var temp = "oh";
}
alert(temp);
很簡單的幾行代碼,如果是按照通常的程序語言經(jīng)驗,我們會認(rèn)為alert語句會報錯,然而事實(shí)并不是這樣,alert語句正常的輸出了“oh” 這個字符串,所以在
Javascript中不存在語句塊的概念。
上面兩個示例都很簡單,也許并不是多高的技術(shù),很多高手應(yīng)該早已了解,但是這兩個語言特性應(yīng)該還是比較有用的,也許了解這些特性后,在寫JS的時候會減少一些出錯的機(jī)會,所以還是發(fā)上來和大家分享一下,希望能夠?qū)Υ蠹覍慗S的時候幫助。
您可能感興趣的文章:
- JavaScript詞法作用域與調(diào)用對象深入理解
- JavaScript中的作用域鏈和閉包
- javascript作用域容易記錯的兩個地方分析
- 深入理解JavaScript系列(14) 作用域鏈介紹(Scope Chain)
- 淺談javascript中的作用域
- js變量以及其作用域詳解
- js使用函數(shù)綁定技術(shù)改變事件處理程序的作用域
- javascript權(quán)威指南 學(xué)習(xí)筆記之變量作用域分享
- javascript中的作用域scope介紹
- 關(guān)于JavaScript中var聲明變量作用域的推斷
- JavaScript.The.Good.Parts閱讀筆記(二)作用域&閉包&減緩全局空間污染
- JavaScript中實(shí)現(xiàn)塊作用域的方法
- Javascript學(xué)習(xí)筆記3 作用域
- JavaScript的變量作用域深入理解
- Javascript 作用域使用說明
- JavaScript 變量作用域及閉包
- javascript 變量作用域 代碼分析
- javascript變量作用域使用中常見錯誤總結(jié)
相關(guān)文章
Bootstrap 手風(fēng)琴菜單的實(shí)現(xiàn)代碼
這篇文章主要介紹了Bootstrap 手風(fēng)琴菜單的實(shí)現(xiàn)代碼,需要的朋友可以參考下2017-01-01
JavaScript中for...in、for...of和for await...of迭代方式
方法2023-04-04
解決npm安裝Electron緩慢網(wǎng)絡(luò)超時導(dǎo)致失敗的問題
下面小編就為大家分享一篇解決npm安裝Electron緩慢網(wǎng)絡(luò)超時導(dǎo)致失敗的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-02-02
通過實(shí)例解析JavaScript for in及for of區(qū)別
這篇文章主要介紹了通過實(shí)例解析JavaScript for in及for of區(qū)別,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-06-06
學(xué)習(xí)JavaScript設(shè)計模式之單例模式
這篇文章主要為大家介紹了JavaScript設(shè)計模式中的單例模式,對JavaScript設(shè)計模式感興趣的小伙伴們可以參考一下2016-01-01
Promise 鏈?zhǔn)秸{(diào)用原理精簡示例
這篇文章主要為大家介紹了Promise 鏈?zhǔn)秸{(diào)用原理精簡示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12
js實(shí)現(xiàn)一款簡單踩白塊小游戲(曾經(jīng)很火)
本文給大家分享原生js實(shí)現(xiàn)曾經(jīng)很火的一款小游戲—別踩白塊,代碼簡單易懂,非常不錯,具有一定的參考借鑒價值,需要的朋友參考下吧2019-12-12
js使用removeChild方法動態(tài)刪除div元素
本節(jié)為大家介紹了js使用removeChild方法動態(tài)刪除div元素,需要的朋友可以參考下2014-08-08

