循环中setTimeout打印结果(使用闭包)

来源:互联网 发布:java 时间转时间戳 编辑:程序博客网 时间:2024/05/18 16:36
for(var i=1;i<4;i++){    setTimeout(function(){        console.log(i);    },1000);}

上面的代码会在1秒之后输出3个4,原因是i为全局变量,会先执行完循环(js是单线程机制,先执行同步代码,最后执行异步代码,setTimeout是异步调用),此时i的值已经为4,之前每次循环放入异步队列中的函数就会依次打印出i的值,即连续打印3次4

问题:如何将上面的改为1秒之后一次输出1,2,3?(一种是es6中的let声明变量i,此处利用闭包实现)

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

上面的代码即可实现1秒后依次打印出1,2,3;此处利用闭包每次将i的值传入进去,里面使用参数j接受传过来的值,然后setTimeout异步调用,进入异步队列,循环代码很快执行完,在1秒后,从异步队列里返回执行后的结果,依次打印出1,2,3.

问题:如何使每隔1秒依次打印一个结果?(设置延迟时间依次增加1秒即可)

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

上面代码在延迟执行时间那块加了一个参数j,j的值每次都会增加1,使时间每次扩大比上次大一倍,从而实现了每隔一秒就打印出一个结果