美文网首页
js for循环问题解析

js for循环问题解析

作者: 零穆 | 来源:发表于2020-07-14 16:33 被阅读0次

问题原因

  首先让我们来看一段代码

 function foo(){
  for (var i = 0;i<3;i++){
    console.log(i)
  }
}
 function foo1(){
  for (var i = 0;i<3;i++){
     setTimeout( function timer() { console.log( i ); }, i*1000 );
  }
}
foo() //0 1 2 
foo1() // 3 3 3

  foofoo1同样是for循环。为什么一个输出0 1 2,一个输出3 3 3呢?而我们希望 foo1 也输出 0 1 2该怎么解决呢?这个就与 js 的作用域相关了。当var声明变量是不会有块级作用域的,上述代码相当于。

function foo(){
 {
   var i = 0
    console.log(i)
 }
 {
  var  i = 1 
    console.log(i)
  }
 {
  var  i = 2 
    console.log(i)
  }
  {
  var  i = 3//终止循环了
  }
}

function foo1(){
 {
   var  i = 0
    setTimeout( function timer() { console.log( i ); }, i*1000 );
 }
 {
  var  i = 1 
    setTimeout( function timer() { console.log( i ); }, i*1000 );
  }
 {
 var   i = 2 
    setTimeout( function timer() { console.log( i ); }, i*1000 );
  }
  {
  var  i = 3//终止循环了
  }
}
foo() //0 1 2 
foo1() // 3 3 3

如上述代码,foo会输出 0 1 2,就很好理解。foo1()遇到setTimeout,setTimeout内部的函数会放到循环执行完毕之后去执行它。而这时 i 的值 已经是 3了所以他们会输出3 3 3。解决这个问题很好解决,因为我们知道是因为 var 没有产生块级作用域。

解决方法1

所以我们用let就阔以解决它了。

function foo1(){

  for (let i = 0;i<3;i++){
     setTimeout( function timer() { console.log( i ); }, i*1000 );
  }

}
foo1(); //0 1 2

那么假如我们不想使用let,该如何解决呢?也有办法。

解决方法2

function foo1(){

for (var i=0; i<3; i++) { 
  (function(j) { 
    setTimeout( 
      function timer() { 
        console.log( j ); 
       }, j*1000 ); 
  })( i );
  }
}
foo1(); //0 1 2

我们利用立即执行函数去接收i, 函数内部作用域中,j就是i的值,不会i的改变影响。

相关文章

  • js for循环问题解析

    问题原因   首先让我们来看一段代码   foo和foo1同样是for循环。为什么一个输出0 1 2,一个输出3 ...

  • Node问题解析

    Node问题解析(问题和部分答案采用与Eleme) 1.a.js和b.js两个文件互相require是否会死循环?...

  • 浏览器渲染原理

    HTML 的解析过程 js 的下载和执行会阻塞 HTML 的解析,等 js 执行完继续去解析 HTML 问题1:为...

  • node 事件

    1、事件 1.1普通事件的使用 1.2、Node.js 的事件循环机制解析 1)Node 由事件循环开始,到事件循...

  • JavaScript 04 (do...while循环/for

    js循环,js循环嵌套,js do...while循环,js的for循环,js中的break,js中的contin...

  • js中循环遍历中顺序执行多个嵌套ajax的问题

    js中循环遍历中顺序执行多个嵌套ajax的问题

  • 循环当中的匿名函数问题

    前言:从《原生JS实现轮播(上)》中JS实现渐变效果引出的循环中匿名函数的问题。 如果匿名函数里使用了循环变量,或...

  • Vue.js动态组件解析

    此前的Vue.js系列文章: Vue.js开发常见问题解析 Vue.js常用开发知识简要入门(一) Vue.js常...

  • 循环引用导致的undefined问题

    问题描述 两个JS文件存在循环import时,将导致undefined问题 原因分析 如下两个js,假定先加载a....

  • 2017.08.18

    问题 JS中foreach语义中希望使用break打断循环失败。 JS中Foreach为什么不能break?如何实...

网友评论

      本文标题:js for循环问题解析

      本文链接:https://www.haomeiwen.com/subject/aclfhktx.html