Javascript 變量作用域 兩個(gè)可能會(huì)被忽略的小特性
更新時(shí)間:2010年03月23日 22:56:43 作者:
關(guān)于Javascript,大家肯定都很熟悉啦,對(duì)于有編程經(jīng)驗(yàn)的朋友來(lái)說(shuō),Javascript很快就能上手,不過(guò)關(guān)于JS的變量作用域,還是有一點(diǎn)差別的。
也許有些高手早已知道了,但是我覺(jué)得這兩個(gè)東西還是有一些價(jià)值的,所以拿到這里和大家分享一下吧
. 有如下代碼:
<script type="text/javascript" >
function test() {
with (location) {
var temp = "an url";
}
alert(temp);
}
test();
</script>
調(diào)用這個(gè)函數(shù)會(huì)輸出什么呢? 也許會(huì)認(rèn)為它會(huì)彈出undefined, 但實(shí)際上,它彈出的是"an url"這個(gè)字符串,這就涉及到JavaScript中變量作用域的一個(gè)概念。
JS中,每個(gè)作用域都有一個(gè)相應(yīng)的"變量對(duì)象"(這么叫不一定準(zhǔn)確,知道有這么個(gè)東西就行了),這里面存放著當(dāng)前作用域定義的標(biāo)識(shí)符。JS程序開(kāi)始的時(shí)候,會(huì)進(jìn)入全局作用域, 在我們的程序中,因?yàn)槿肿饔糜蛑卸x了test函數(shù),所以它這里的“變量對(duì)象”就存放了test函數(shù)的標(biāo)識(shí)符。接下來(lái),我們調(diào)用了test函數(shù),就進(jìn)入了,test函數(shù)的作用域,test函數(shù)本身的作用域也有自己的"變量對(duì)象",進(jìn)入test的作用域的時(shí)候,也會(huì)把全局作用域里存放的標(biāo)識(shí)符復(fù)制進(jìn)來(lái),所以,在test函數(shù)中就可以訪問(wèn)全局作用域中定義的標(biāo)識(shí)符了,但是在外層作用域,是不能看到內(nèi)層的內(nèi)容的。如果這樣的話,那我們這里的alert(temp)就會(huì)輸出undefined,因?yàn)閠emp是在內(nèi)層作用域定義的。但是為什么在這里卻能夠找到在內(nèi)層作用域里定義的標(biāo)識(shí)符呢?
因?yàn)閣ith語(yǔ)句塊中作用域的"變量對(duì)象" 是只讀的,所以在他本層定義的標(biāo)識(shí)符,不能存儲(chǔ)到本層,而是存儲(chǔ)到它的上一層作用域,也就是test函數(shù)的作用域,所以,我們的alert(temp)這條語(yǔ)句,就可以訪問(wèn)到那個(gè)在內(nèi)層定義的temp變量了。同樣的情形還出現(xiàn)在try catch 語(yǔ)句里面。
.Javascript中沒(méi)有語(yǔ)句塊的概念,代碼如下:
if (true) {
var temp = "oh";
}
alert(temp);
很簡(jiǎn)單的幾行代碼,如果是按照通常的程序語(yǔ)言經(jīng)驗(yàn),我們會(huì)認(rèn)為alert語(yǔ)句會(huì)報(bào)錯(cuò),然而事實(shí)并不是這樣,alert語(yǔ)句正常的輸出了“oh” 這個(gè)字符串,所以在
Javascript中不存在語(yǔ)句塊的概念。
上面兩個(gè)示例都很簡(jiǎn)單,也許并不是多高的技術(shù),很多高手應(yīng)該早已了解,但是這兩個(gè)語(yǔ)言特性應(yīng)該還是比較有用的,也許了解這些特性后,在寫(xiě)JS的時(shí)候會(huì)減少一些出錯(cuò)的機(jī)會(huì),所以還是發(fā)上來(lái)和大家分享一下,希望能夠?qū)Υ蠹覍?xiě)JS的時(shí)候幫助。
. 有如下代碼:
復(fù)制代碼 代碼如下:
<script type="text/javascript" >
function test() {
with (location) {
var temp = "an url";
}
alert(temp);
}
test();
</script>
調(diào)用這個(gè)函數(shù)會(huì)輸出什么呢? 也許會(huì)認(rèn)為它會(huì)彈出undefined, 但實(shí)際上,它彈出的是"an url"這個(gè)字符串,這就涉及到JavaScript中變量作用域的一個(gè)概念。
JS中,每個(gè)作用域都有一個(gè)相應(yīng)的"變量對(duì)象"(這么叫不一定準(zhǔn)確,知道有這么個(gè)東西就行了),這里面存放著當(dāng)前作用域定義的標(biāo)識(shí)符。JS程序開(kāi)始的時(shí)候,會(huì)進(jìn)入全局作用域, 在我們的程序中,因?yàn)槿肿饔糜蛑卸x了test函數(shù),所以它這里的“變量對(duì)象”就存放了test函數(shù)的標(biāo)識(shí)符。接下來(lái),我們調(diào)用了test函數(shù),就進(jìn)入了,test函數(shù)的作用域,test函數(shù)本身的作用域也有自己的"變量對(duì)象",進(jìn)入test的作用域的時(shí)候,也會(huì)把全局作用域里存放的標(biāo)識(shí)符復(fù)制進(jìn)來(lái),所以,在test函數(shù)中就可以訪問(wèn)全局作用域中定義的標(biāo)識(shí)符了,但是在外層作用域,是不能看到內(nèi)層的內(nèi)容的。如果這樣的話,那我們這里的alert(temp)就會(huì)輸出undefined,因?yàn)閠emp是在內(nèi)層作用域定義的。但是為什么在這里卻能夠找到在內(nèi)層作用域里定義的標(biāo)識(shí)符呢?
因?yàn)閣ith語(yǔ)句塊中作用域的"變量對(duì)象" 是只讀的,所以在他本層定義的標(biāo)識(shí)符,不能存儲(chǔ)到本層,而是存儲(chǔ)到它的上一層作用域,也就是test函數(shù)的作用域,所以,我們的alert(temp)這條語(yǔ)句,就可以訪問(wèn)到那個(gè)在內(nèi)層定義的temp變量了。同樣的情形還出現(xiàn)在try catch 語(yǔ)句里面。
.Javascript中沒(méi)有語(yǔ)句塊的概念,代碼如下:
復(fù)制代碼 代碼如下:
if (true) {
var temp = "oh";
}
alert(temp);
很簡(jiǎn)單的幾行代碼,如果是按照通常的程序語(yǔ)言經(jīng)驗(yàn),我們會(huì)認(rèn)為alert語(yǔ)句會(huì)報(bào)錯(cuò),然而事實(shí)并不是這樣,alert語(yǔ)句正常的輸出了“oh” 這個(gè)字符串,所以在
Javascript中不存在語(yǔ)句塊的概念。
上面兩個(gè)示例都很簡(jiǎn)單,也許并不是多高的技術(shù),很多高手應(yīng)該早已了解,但是這兩個(gè)語(yǔ)言特性應(yīng)該還是比較有用的,也許了解這些特性后,在寫(xiě)JS的時(shí)候會(huì)減少一些出錯(cuò)的機(jī)會(huì),所以還是發(fā)上來(lái)和大家分享一下,希望能夠?qū)Υ蠹覍?xiě)JS的時(shí)候幫助。
您可能感興趣的文章:
- JavaScript詞法作用域與調(diào)用對(duì)象深入理解
- JavaScript中的作用域鏈和閉包
- javascript作用域容易記錯(cuò)的兩個(gè)地方分析
- 深入理解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 作用域使用說(shuō)明
- JavaScript 變量作用域及閉包
- javascript 變量作用域 代碼分析
- javascript變量作用域使用中常見(jiàn)錯(cuò)誤總結(jié)
相關(guān)文章
一起來(lái)了解一下JavaScript的預(yù)編譯(小結(jié))
這篇文章主要介紹了一起來(lái)了解一下JavaScript的預(yù)編譯(小結(jié)),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03解決頁(yè)面js接受Long型損失精度問(wèn)題(最新解決方案)
這篇文章主要介紹了解決頁(yè)面js接受Long型損失精度問(wèn)題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-03-03echarts中tooltip添加點(diǎn)擊事件代碼示例
這篇文章主要給大家介紹了關(guān)于echarts中tooltip添加點(diǎn)擊事件的相關(guān)資料,echarts tooltip點(diǎn)擊事件是指當(dāng)用戶(hù)點(diǎn)擊圖表中的提示框(tooltip)時(shí)觸發(fā)的事件,需要的朋友可以參考下2023-07-07關(guān)于JS數(shù)組追加數(shù)組采用push.apply的問(wèn)題
JS數(shù)組追加數(shù)組沒(méi)有現(xiàn)成的函數(shù),這么多年我已經(jīng)習(xí)慣了a.push.apply(a, b);這種自以為很酷的,不需要寫(xiě)for循環(huán)的寫(xiě)法,一直也沒(méi)遇到什么問(wèn)題,直到今天我要append的b是個(gè)很大的數(shù)組時(shí)才遇到了坑。2014-06-06IScroll5 中文API參數(shù)說(shuō)明和調(diào)用方法
IScroll是移動(dòng)頁(yè)面上被使用的一款仿系統(tǒng)滾動(dòng)插件。IScroll5相對(duì)于之前的IScroll4改進(jìn)了許多,使得大家可以更方便的定制所需的功能了。2016-05-05原生Javascript插件開(kāi)發(fā)實(shí)踐
本文主要介紹了原生Javascript插件開(kāi)發(fā)的思路分析以及使用示例。具有一定的參考價(jià)值,下面跟著小編一起來(lái)看下吧2017-01-01