從一個詭異的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爲函數級做用域,而咱們用它作循環索引的時候實際上是想看成塊級做用域使用。code

解決辦法索引

想要達到塊級做用域效果能夠使用ES6語法的let關鍵字實現:作用域

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

或者只針對解決上述問題,沒必要糾結做用域問題的話,我用了更low一些但能夠解決問題的,那就是分支2就不用i,換成j同樣可行。for循環

相關文章
相關標籤/搜索