从一个诡异的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循环

相关文章
相关标签/搜索