从一个诡异的bug发现js变量作用域问题

发表于:2019-4-10 14:25

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:worldShine    来源:思否

   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一样可行。

     上文内容不用于商业目的,如涉及知识产权问题,请权利人联系博为峰小编(021-64471599-8017),我们将立即处理。
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号