天天躁日日躁狠狠躁AV麻豆-天天躁人人躁人人躁狂躁-天天澡夜夜澡人人澡-天天影视香色欲综合网-国产成人女人在线视频观看-国产成人女人视频在线观看

js for循環,為什么一定要加var定義i變量

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

  但是,這真的不是個好習慣,下面我就說說為什么寫Js的for循環一定要加var,否則會時不時給你帶來煩人難查的bug。
  譬如現在我們要實現這樣的功能:輸出  
  10
  20
  30
  40
  50
  60
  70
  80
  90
  100
  通過下面code實現,WriteNumber從1到10循環,每次循環調用TenTimes方法返回10倍的索引值。 
復制代碼 代碼如下:
<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>

  你會發現最終只輸出了10。大家可以用下面的代碼框運行測試。

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

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

[Ctrl+A 全選 注:如需引入外部Js需刷新才能執行]
Ps:說道coding的好習慣,想起了這個:if(a==3) 應該寫成if(3==a) 。因為我們常會把==寫成1個=,如果把變量寫在右邊時只寫了1個=,就會報編譯錯誤,這樣就能及時發現錯誤。

JavaScript技術js for循環,為什么一定要加var定義i變量,轉載需保留來源!

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

主站蜘蛛池模板: 我把寡妇日出水好爽 | 帝王被大臣们调教高肉 | A级毛片高清免费网站不卡 a级毛片高清免费视频 | 综合精品欧美日韩国产在线 | 亚洲永久精品AV在线观看 | 少女亚洲free | 亚洲综合国产在不卡在线 | 蜜芽在线播放免费人成日韩视频 | 久久天天躁狠狠躁夜夜躁 | 玩两个少妇女邻居 | 精品国产在线国语视频 | 亚洲AV怡红院AV男人的天堂 | 国产69精品久久久久乱码免费 | 精品无人区麻豆乱码无限制 | 一边捏奶头一边啪高潮会怎么样 | 阿v天堂2017在无码 | 正在播放国产精品 | 亚洲人美女肛交真人全程 | 亚洲成人免费在线观看 | 爱啪国产精品视频在线 | 色情内射少妇兽交 | 亚洲视频欧美在线专区 | 国产在线一卡二卡 | 爱穿丝袜的麻麻3d漫画acg | 欧美日韩亚洲一区视频二区 | 母狗黄淑珍 | 2022久久精品国产色蜜蜜麻豆 | 成人免费在线观看视频 | 手机在线成人精品视频网 | 中文字幕亚洲第一 | 亚洲国产系列一区二区三区 | 恋孩癖网站大全在线观看 | 日本大片免a费观看视频 | 超碰久久国产vs | 人妻无码AV中文系统久久免费 | 蜜臀久久99精品久久久久久做爰 | 拔萝卜视频免费看高清 | 极品少妇粉嫩小泬啪啪AV | 夜夜躁日日躁狠狠 | 天天操狠狠操夜夜操 | 国产三级级在线电影 |