脚本宝典收集整理的这篇文章主要介绍了从一个诡异的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一样可行。
以上是脚本宝典为你收集整理的从一个诡异的bug发现js变量作用域问题全部内容,希望文章能够帮你解决从一个诡异的bug发现js变量作用域问题所遇到的问题。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。