今日處理項目中的一個循環,本來就是一個小小的for循環,后來發現該段程序出現了問題,仔細檢查代碼沒有發現其中的錯誤。無奈只好叫來了老大幫忙。通過在模版中斷點調試(該方式只能自己寫debugger斷點)我們找到了問題的所在。首先看我們的循環:
for(var i =0, len = arr.length; i<len; i++){ console.log(arr[i]); for(var i=0; i<x.length; i++) { console.log(x[i]); } }
這是一個很簡單的嵌套循環,但問題出在這里。我們在第一個for循環內定一個變量I,同時在第二個循環中也定義了同名的i,根據老大的說法是: 第二個i是局部變了,它的定義不影響外層的i。但是,經過調試,結果與他說的完全相反。無論是第一個for循環中的i或者第二個循環中的i都是同一個全局變量,所以第二個循環中的變量將第一個i覆蓋了!!!.也就是說for()循環中的作用域是全局的,是指向父級,並不是像function一樣創造了一個獨立的環境。為了證實這個說法,我們可以寫下列例子。
for(var i =0; i<5; i++){ console.log(i); for(var i=0; i<8; i++) { console.log(i); } }
可以在瀏覽器中看到他連續輸出一段數字:
第一個0是外層的for輸出的,接下來所有的數字都是里面那層for循環輸出的。可以看到,外層只循環了一次,這是因為在里面那個關鍵字i循環過后被復制為8,那么當外面那層做第二循環的時候會對比條件i<5,顯然,此時該條件已經不滿足了,外層就不會再循環了。但是還是會執行一下i++,最后,i就成了9.
一個很小的問題,被困住了將近半個小時,幸好有老大指點。所以以后大家在做多重循環的時候就要注意這個問題了。