今日處理項目中的一個循環,原本就是一個小小的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同樣創造了一個獨立的環境。爲了證明這個說法,咱們能夠寫下列例子。spa
for(var i =0; i<5; i++){ console.log(i); for(var i=0; i<8; i++) { console.log(i); } }
能夠在瀏覽器中看到他連續輸出一段數字:debug
第一個0是外層的for輸出的,接下來全部的數字都是裏面那層for循環輸出的。能夠看到,外層只循環了一次,這是由於在裏面那個關鍵字i循環事後被複製爲8,那麼當外面那層作第二循環的時候會對比條件i<5,顯然,此時該條件已經不知足了,外層就不會再循環了。可是仍是會執行一下i++,最後,i就成了9.調試
一個很小的問題,被困住了將近半個小時,幸虧有老大指點。因此之後你們在作多重循環的時候就要注意這個問題了。code