從一個詭異的bug發明js變量作用域題目

for (var i = 0; child && i < child.length; i++) {
            var obj = child[i];
            var kind = child[i].kind;
            var deiveId = child[i].id;
            if (kind == "4") {//分支1
                 // do sometjing
            }else{//分支2
                for(i in arr){
                   //do something
                }
            }

以上代碼產生了一個表面上看起來會很詭異的題目,就是假如kind!=4的分支2情況下,有時刻會致使外層的for輪迴轉頭,即:明顯最外層已輪迴到child的末了一個了,跑完分支2以後,外層for輪迴又轉頭實行。

緣由剖析:
我想專業人士不像我這麼渣的話會發現題目在變量i,此處i並不會成為塊級變量,而是函數級,分支2中的i變化會致使外層i變化,從而致使輪迴轉頭。
js在ES6之前沒有塊級作用域,只分為全局作用域和函數級作用域,此處i為函數級作用域,而我們用它做輪迴索引的時刻實際上是想看成塊級作用域運用。

處理辦法

想要到達塊級作用域結果能夠運用ES6語法的let關鍵字完成:

for(let i=0;i<arr.length;i++){
}

或許只針對處理上述題目,沒必要糾結作用域題目的話,我用了更low一些但能夠處理題目的,那就是分支2就不必i,換成j一樣可行。

    原文作者:worldShine
    原文地址: https://segmentfault.com/a/1190000014978641
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞