你知道js當中for迴圈當中的bug嗎,如何解決它

2022-01-21 20:05:11 字數 1303 閱讀 8742

本來以為for迴圈可以很好的解決一切問題,直到今天遇到了這段**,重新整理了我對for迴圈的認識,話不多說,直接上**

var arr = ;

for(var i = 0;i<10;i++)

}arr[3]();

大家看上面這段**,我先宣告了乙個空陣列,然後把它放在迴圈裡面,迴圈新增函式作為arr陣列的資料,第一印象看到的時候,肯定不少人會毫不猶豫的說出3這個答案,

因為索引為3的時候console.log剛好是3嗎,想想差點自己都信了,但是,結果呢?

結果明顯是10,那麼原因是什麼呢?由於for迴圈中的i變數是用var宣告的,此時的 i 在全部範圍內都有效,所以每一次迴圈,新的i值會覆蓋舊的i值,導致最後輸出是最後一輪的i的值,當最後輸出的時候i 已經變為10了

那麼,有沒有解決的辦法呢,辦法是有的,且聽我慢慢道來:

方法一:閉包

再用閉包的時候,你首先要了解什麼是閉包,所謂「閉包」,指得是擁有許多變數和繫結了這些變數的環境的表示式(通常是乙個函式),它可以訪問區域性變數,並且在訪問的同時使區域性變數的記憶體不被釋放。那麼,怎麼用閉包呢,簡單點來講,就是巢狀函式。**如下:

var arr = ;

for(var i = 0;i

<

10;i++)

})(i)

}arr[3]();

將for的迴圈內容方法放在乙個自呼叫的匿名函式裡面,這個時候的val是由 i 來傳遞的,此時的變數val可以被訪問,而且記憶體不被釋放,也就是說,val沒有覆蓋一說,所以自然而然的輸出結果是3

方法二:es6當中的let

es6現在的推行範圍不是很廣,而且許多低版本的瀏覽器無法識別es6,所以此方法用的時候是有侷限性的,建議你把瀏覽器的版本公升為高版本;

好嘞,言歸正真,我們先來了解一下什麼是es6當中的let:

let全稱為**塊作用域,顧名思義他是作用域**塊的,它和var的用法相似,但是在同乙個**快中不能出現重名的let變數;**如下:

var arr = ;

for(let i = 0;i

<

10;i++)

}arr[3]();

變數i是let宣告的,當前i只在本輪迴圈中有效所以每次迴圈的i其實是乙個新的變數,所以最後輸出的是3

才疏學淺,目前只發現了這兩種方法,如果有新方法或者不對的地方,請指教。

JS當中的拷貝!!!

最近在複習前端的筆試和面試題目,看到了深拷貝和淺拷貝的問題,在這裡自己查點資料寫下這一篇部落格用來複習!var name jozo var city guangzhou var age 22 它們在記憶體中是這樣的 引用型別的儲存需要記憶體的棧區和堆區 堆區是指記憶體裡的堆記憶體 共同完成,棧區記憶...

js當中如何合併陣列

js中的array物件提供了乙個叫 concat 方法,連線兩個或更多的陣列,並返回結果 var arr1 1,2,3 var arr2 5,6,8 var arr3 arr1.concat arr2 console.log arr3 1,2,3,5,6,8 這個concat方法連線兩個陣列之後,會...

js當中null和 區別

是乙個不完全空的物件,因為他的原型鏈上還有object呢,而null就是完全空的物件,啥也沒有,原型鏈也沒有,所以null instanceof object false 就更不用說了,它的原型鏈上還比 多乙個array。所以,純粹意義上初始化乙個空物件應該用null,更像是初始化物件,和new乙個...