最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

js for循環(huán),為什么一定要加var定義i變量

 更新時(shí)間:2010年06月25日 20:45:20   作者:  
我知道,有些人(譬如之前的我)寫js的for循環(huán)時(shí),都不習(xí)慣加上var,這當(dāng)然是語法允許的。
譬如下面。
復(fù)制代碼 代碼如下:

for(i=0;i<10;i++){//就不寫成: var i=0
   alert(i);
}

  但是,這真的不是個(gè)好習(xí)慣,下面我就說說為什么寫Js的for循環(huán)一定要加var,否則會(huì)時(shí)不時(shí)給你帶來煩人難查的bug。
  譬如現(xiàn)在我們要實(shí)現(xiàn)這樣的功能:輸出  
  10
  20
  30
  40
  50
  60
  70
  80
  90
  100
  通過下面code實(shí)現(xiàn),WriteNumber從1到10循環(huán),每次循環(huán)調(diào)用TenTimes方法返回10倍的索引值?!?
復(fù)制代碼 代碼如下:

<script type="text/javascript">
function WriteNumber() {
for (i = 1; i <= 10; i++) {
document.write(TenTimes(i) + "<br/>")
}
}
function TenTimes(v) {
var result = 0;
alert(i);
for (i = 1; i <= 10; i++) {
result += v;
}
return result;
}
WriteNumber();
//alert(i)
</script>

  你會(huì)發(fā)現(xiàn)最終只輸出了10。大家可以用下面的代碼框運(yùn)行測(cè)試。

關(guān)于在WriteNumber和TenTimes方法里加不加var,就是說是否聲明索引變量i有4種情況:
  第一種情況,WriteNumber和TenTimes各有1個(gè)for循環(huán),2個(gè)循環(huán)里均沒有用var聲明i索引變量。
  運(yùn)行結(jié)果:會(huì)alert出1。結(jié)果只輸出了10,不是我們所想要的。
  分析:執(zhí)行WriteNumber時(shí),其作用域內(nèi)并沒有找到聲明過的變量i,直接對(duì)i進(jìn)行賦值,則隱式的將i聲明為全局變量,(對(duì)于函數(shù)內(nèi)部未聲明過的變量,如果給它賦值,會(huì)隱式的將它聲明為全局變量。) 循環(huán)開始,i=1,調(diào)TenTimes方法,發(fā)現(xiàn)TenTimes方法也沒有聲明過變量i ,所以TenTimes里的i就是全局變量i,就和WriteNumber的i成了同一個(gè)。 這時(shí)line9 alert出來的自然是1了。TenTimes循環(huán)了10次,使得全局的i變成了11,自然WriteNumber就不會(huì)執(zhí)行第2次循環(huán)操作了。
  驗(yàn)證:如果在WriteNumber();語句后加alert(i),即取消line16的注釋,會(huì)發(fā)現(xiàn)alert出12(12=10+2個(gè)i++),證明了i此時(shí)為windows對(duì)象。
  第二種情況,WriteNumber聲明了i變量,即line3: var i=1,TenTimes未聲明i變量,即line10: i=1。
  運(yùn)行結(jié)果:line9 alert(i)處報(bào)i未定義錯(cuò)誤 ,因?yàn)閃riteNumber有聲明過變量i,所以沒有成為全局的i,TenTimes執(zhí)行時(shí)又沒有聲明過i,所以報(bào)未定義。若注釋掉line9,輸出結(jié)果正確。因?yàn)楫?dāng)TenTimes里運(yùn)行到i=1時(shí),隱式將i聲明是全局變量,不影響WriteNumber里的i。WriteNumber仍然會(huì)執(zhí)行10次循環(huán)。
  驗(yàn)證:如果在WriteNumber();語句后加alert(i),即取消line16的注釋,會(huì)發(fā)現(xiàn)alert出11(11=10+TenTimes里的i++),證明了此時(shí)有windows.i。
  第三種情況,WriteNumber沒有聲明i變量,即line3: i=1,TenTimes聲明了i變量,即line10: var i=1。
  運(yùn)行結(jié)果:彈出10個(gè)undefined。因?yàn)閃riteNumber未聲明i,隱式將i聲明是全局變量,而TenTimes有聲明過變量i(補(bǔ)充一句,對(duì)于變量的聲明都是在預(yù)編譯中進(jìn)行的),所以line9 alert(i)里的i不是windows.i,而是TenTimes聲明的變量i,此時(shí)當(dāng)然是undefined了。同時(shí),發(fā)現(xiàn)輸出結(jié)果正確,因?yàn)門enTimes的i不會(huì)影響WriteNumber的全局i,WriteNumber仍然是執(zhí)行了10次循環(huán)。
  第四種情況:WriteNumber和TenTimes均用var聲明了i。
  運(yùn)行結(jié)果:注釋掉line9,不說了,好習(xí)慣,結(jié)果當(dāng)然完美。
  雖然第二、三種情況輸出結(jié)果是正確的,但是對(duì)i的使用很混亂,應(yīng)該算是運(yùn)氣導(dǎo)致結(jié)果正確,因?yàn)閯偤?個(gè)是window.i,一個(gè)是函數(shù)內(nèi)部的私有變量i,使得沒有沖突。
此文雖然講的是寫for循環(huán)為什么一定要加var,但其實(shí)講的是變量的作用域(或者說變量的生命周期)。理解之后,下面的2段code運(yùn)行結(jié)果你應(yīng)該能準(zhǔn)確說出答案吧。


Ps:說道coding的好習(xí)慣,想起了這個(gè):if(a==3) 應(yīng)該寫成if(3==a) 。因?yàn)槲覀兂?huì)把==寫成1個(gè)=,如果把變量寫在右邊時(shí)只寫了1個(gè)=,就會(huì)報(bào)編譯錯(cuò)誤,這樣就能及時(shí)發(fā)現(xiàn)錯(cuò)誤。

相關(guān)文章

  • JavaScript利用canvas實(shí)現(xiàn)星空效果

    JavaScript利用canvas實(shí)現(xiàn)星空效果

    Canvas對(duì)于我們前端來說是一個(gè)非常強(qiáng)大的工具,它可以實(shí)現(xiàn)各種復(fù)雜的圖形和動(dòng)畫效果,我們?nèi)绻軌蚴炀氄莆账?我們就可以做很多炫酷的效果,本文就給大家介紹了用canvas畫出一片星空的方法,需要的朋友可以參考下
    2023-11-11
  • 生成html靜態(tài)文件后的分頁(客戶端版)

    生成html靜態(tài)文件后的分頁(客戶端版)

    生成html靜態(tài)文件后的分頁(客戶端版)...
    2006-07-07
  • javascript搜索框點(diǎn)擊文字消失失焦時(shí)文本出現(xiàn)

    javascript搜索框點(diǎn)擊文字消失失焦時(shí)文本出現(xiàn)

    這篇文章主要介紹了javascript實(shí)現(xiàn)搜索框點(diǎn)擊文字消失失焦時(shí)文本出現(xiàn)的效果,示例代碼如下,大家可以看看
    2014-09-09
  • JSON.stringify實(shí)例詳解以及靈活運(yùn)用

    JSON.stringify實(shí)例詳解以及靈活運(yùn)用

    在向服務(wù)器發(fā)送數(shù)據(jù)時(shí)一般是字符串,我們可以使用?JSON.stringify()方法將JavaScript對(duì)象轉(zhuǎn)換為字符串,下面這篇文章主要給大家介紹了關(guān)于JSON.stringify及靈活運(yùn)用的相關(guān)資料,需要的朋友可以參考下
    2022-03-03
  • js算法實(shí)例之字母大小寫轉(zhuǎn)換

    js算法實(shí)例之字母大小寫轉(zhuǎn)換

    實(shí)現(xiàn)javascript?英文首字母大寫有多種方法,下面這篇文章主要給大家介紹了關(guān)于js算法實(shí)例之字母大小寫轉(zhuǎn)換的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-12-12
  • 如何使用less實(shí)現(xiàn)隨機(jī)下雪動(dòng)畫詳解

    如何使用less實(shí)現(xiàn)隨機(jī)下雪動(dòng)畫詳解

    這篇文章主要給大家介紹了關(guān)于如何使用less實(shí)現(xiàn)隨機(jī)下雪動(dòng)畫的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-01-01
  • ionic隱藏tabs的方法

    ionic隱藏tabs的方法

    這篇文章主要為大家詳細(xì)介紹了ionic隱藏tabs的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-08-08
  • javascript實(shí)現(xiàn)京東登錄顯示隱藏密碼

    javascript實(shí)現(xiàn)京東登錄顯示隱藏密碼

    這篇文章主要為大家詳細(xì)介紹了javascript實(shí)現(xiàn)京東登錄顯示隱藏密碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-08-08
  • javascript輸出AscII碼擴(kuò)展集中的字符方法

    javascript輸出AscII碼擴(kuò)展集中的字符方法

    下面小編就為大家?guī)硪黄猨avascript輸出AscII碼擴(kuò)展集中的字符方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧,祝大家游戲愉快哦
    2016-12-12
  • javascript實(shí)現(xiàn)好看的可復(fù)用彈窗插件

    javascript實(shí)現(xiàn)好看的可復(fù)用彈窗插件

    這篇文章主要為大家詳細(xì)介紹了javascript實(shí)現(xiàn)好看的可復(fù)用彈窗插件,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-05-05

最新評(píng)論

汉寿县| 胶州市| 南阳市| 瑞安市| 孟津县| 浦江县| 塔城市| 大城县| 无极县| 汽车| 西城区| 西平县| 武陟县| 滕州市| 青冈县| 专栏| 云南省| SHOW| 沙洋县| 彰武县| 屏山县| 普陀区| 洛扎县| 松阳县| 普定县| 香河县| 内黄县| 桃园县| 上林县| 阿勒泰市| 洪湖市| 虎林市| 龙陵县| 兴国县| 洛浦县| 绥化市| 胶南市| 洪雅县| 融水| 莆田市| 钟山县|