中文字幕日韩一区二区_国产一区二区av_国产毛片av_久久久久国产一区_色婷婷电影_国产一区二区精品

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

譬如下面。
復(fù)制代碼 代碼如下:
for(i=0;i<10;i++){//就不寫(xiě)成: var i=0
   alert(i);
}

  但是,這真的不是個(gè)好習(xí)慣,下面我就說(shuō)說(shuō)為什么寫(xiě)Js的for循環(huán)一定要加var,否則會(huì)時(shí)不時(shí)給你帶來(lái)煩人難查的bug。
  譬如現(xiàn)在我們要實(shí)現(xiàn)這樣的功能:輸出  
  10
  20
  30
  40
  50
  60
  70
  80
  90
  100
  通過(guò)下面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è)試。

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

[Ctrl+A 全選 注:如需引入外部Js需刷新才能執(zhí)行]

[Ctrl+A 全選 注:如需引入外部Js需刷新才能執(zhí)行]
Ps:說(shuō)道coding的好習(xí)慣,想起了這個(gè):if(a==3) 應(yīng)該寫(xiě)成if(3==a) 。因?yàn)槲覀兂?huì)把==寫(xiě)成1個(gè)=,如果把變量寫(xiě)在右邊時(shí)只寫(xiě)了1個(gè)=,就會(huì)報(bào)編譯錯(cuò)誤,這樣就能及時(shí)發(fā)現(xiàn)錯(cuò)誤。

JavaScript技術(shù)js for循環(huán),為什么一定要加var定義i變量,轉(zhuǎn)載需保留來(lái)源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 成人精品一区二区三区中文字幕 | 国产91久久久久蜜臀青青天草二 | 老司机67194精品线观看 | 国产精品免费一区二区三区 | 免费看91 | 亚洲免费网址 | 日本成人中文字幕在线观看 | 丝袜毛片 | 日本电影韩国电影免费观看 | 日日夜精品视频 | 亚洲国产成人在线视频 | 久久久爽爽爽美女图片 | 久久精品亚洲精品国产欧美kt∨ | 九一在线观看 | 久久久久久亚洲精品 | 在线观看成年人视频 | 精品视频在线免费观看 | 欧美成人精品一区二区三区 | 欧美一级二级在线观看 | 一本在线 | 国产在线一区二区三区 | 日韩成人在线播放 | 欧美一区二区三区在线播放 | a在线视频 | 国产乱一区二区三区视频 | 精品视频一区二区三区 | 欧美日韩高清在线一区 | 成人在线一区二区 | 亚洲一区二区在线播放 | www.久| 超碰97免费 | 欧美一级黄色网 | 在线欧美一区 | 国产精久久久久久 | 久久在线精品 | 在线伊人| 欧美视频免费在线 | 日韩在线视频一区 | 欧美在线资源 | 国产高清视频 | 日韩成人影院 |