题:每隔一秒打印出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.变量会长期驻扎在内存中
这些特点就会运用到这个解决方案中。