js经典题讲解(3)

题:每隔一秒打印出1到10
首先如果说这样写的话:

   for (var i = 1; i <= 10; i++) {
      setTimeout(function () {
         console.log(i)  //11
      },1000)
   }

因为setTimeout为异步函数微任务则js执行代码的时候会先将微任务放在异步队列里面然后等到for循环执行完之后i=11了,所以最后在执行setTime时输出的i就会是11,就不会每隔一秒打印出来1到10。(当然可以使用let块级作用域来解决如果说不使用块级作用域,那可以使用闭包来解决)
使用闭包来解决:

   for (var i = 1; i <= 10; i++) {
      (function (j) {
         setTimeout(function () {
            console.log(j)
         }, 1000*i)
      })(i)
   }

当然闭包的特点就是
1.函数嵌套函数
2.内部函数可以访问到外部函数的变量。
3.变量会长期驻扎在内存中
这些特点就会运用到这个解决方案中。

猜你喜欢

转载自blog.csdn.net/weixin_47459930/article/details/106470509