Posts Tagged With: var

[Web] JavaScript 迴圈隱式變數是全域變數


很少有機會在網頁裡面寫遞迴。最近剛好有個邏輯要用遞迴,結果寫下去就變無窮迴圈了…

所以我做了個簡單的測試範例後,用這個範例萬事問臉書。如下圖:

EnumData 為一個列舉資料的遞迴函數測試範例

當時我並沒有注意到右邊箭號的分區。

這張圖中,變數 ibd 是一個在迴圈內的隱式宣告,一般迴圈的範例都是這樣,所以我也照用了,而在遞迴呼叫中,被呼叫的 ibd 會被重置為 0 ,以至於上層的迴圈永遠無法跑到 2 ,永遠就在 0, 1 打轉。

黃忠成老師給個建議,改用:

for (let ibd=0; ibd<dbArray.length; ibd++){

果然可以。但是我的網頁需要相容 IE 舊版,經查 let 為 ES6 (ES2015) 的規範,所以在 IE 舊版並不支援。

就在苦無對策的時候,忽然發現,右側視窗中,ibd 在全域變數內?隱式宣告預設是全域變數不是區域變數?我一直以為隱式宣告是類似 using 之類的區塊變數,只在迴圈中有效。

既然知道是全域變數,就改成:

var ibd;
for (ibd=0; ibd<dbArray.length; ibd++){

則 ibd 變成函數層級的變數,其實變成函數層級變數就可以了,到不用勉強一定要區域變數,這樣遞迴的變數就不會互相干擾,搞定收工。

當然我也測過 Chrome ,不過截圖就用以 Chrome 為底的 Edge ,因為開發工具畫面是中文,比較親善:

迴圈變數的隱式宣告在 Chrome 也是全域變數

開發者要養成寫測試專案或測試例,這樣有助於縮小範圍鎖定問題,也容易跟其他人溝通。

謝謝黃忠成老師。

Categories: 工作點滴, 技術分享 | 標籤: | 發表留言

在 WordPress.com 建立免費網站或網誌.

%d 位部落客按了讚: