它打印10次10​​次,我不明白为什么?

这个问题在这里已经有了答案:

  • JavaScript闭包与匿名函数12个答案

  • setTimeout是一个异步调用。 这意味着,它只有在整个循环得到执行后才会执行。 在你的JS解释器中,它会是这样的:

     1: for loop.                               // i = 0
     2: send setTimeout #1.     increment i.    // i = 1
     3: send setTimeout #2.     increment i.    // i = 2
     4: send setTimeout #3.     increment i.    // i = 3
     5: send setTimeout #4.     increment i.    // i = 4
     6: send setTimeout #5.     increment i.    // i = 5
     7: send setTimeout #6.     increment i.    // i = 6
     8: send setTimeout #7.     increment i.    // i = 7
     9: send setTimeout #8.     increment i.    // i = 8
    10: send setTimeout #9.     increment i.    // i = 9
    11: send setTimeout #10.    increment i.    // i = 10
    12: finish for loop.                        // i = 10
    13: exec setTimeout #1.                     // i = 10
    14: exec setTimeout #2.                     // i = 10
    15: exec setTimeout #3.                     // i = 10
    16: exec setTimeout #4.                     // i = 10
    17: exec setTimeout #5.                     // i = 10
    18: exec setTimeout #6.                     // i = 10
    19: exec setTimeout #7.                     // i = 10
    20: exec setTimeout #8.                     // i = 10
    21: exec setTimeout #9.                     // i = 10
    22: exec setTimeout #10.                    // i = 10
    

    当执行阶段发生时, i已经有10个了。

    正确的做法是使用闭包。 他们通过打包变量的值来维护环境价值。

    var i;
    var print = function(i) {
      console.log(i);
    };
    for (i = 0; i < 10; i++) {
      (function (a) {
        setTimeout(function () {
          print(a);
        }, 1000);
      })(i);
    }

    这是因为JavaScript事件循环。 所有的setTimeout都堆放在事件循环队列的末尾。 一旦你的for循环完成(在我已经增加到10的时候),所有setTimeouts开始执行。 因此,你总是看到10个打印。


    n值是从封闭中挑选出来的。 它在创建函数时包含值= 1,2,3 ...。

    var i ;
    var print = function(n){
      console.log(n);
    };
    for(i = 0 ; i<10;i++){
     setTimeout((function(n){
       return function () {
         print(n);  
       }
     })(i),1000);
    };
    链接地址: http://www.djcxy.com/p/52025.html

    上一篇: It prints 10 ten times i cannot understand why?

    下一篇: how come I refer to an undeclared variable