js setTimeout和for循环 使用时变量的问题

1. setTimeout(func,time)函数运行机制

setTimeout(func,time)是在time(毫秒单位)时间后执行func函数.浏览器会按照顺序执行,当遇到setTimeout时会将func函数放入执行队列,等主程序执行完毕之后,才开始从执行队列(当然队列中可能会有很多待执行函数)按照延迟时间time取出func函数执行,就算time为0也会等主程序运行完再运行延迟函数。

例子:
js setTimeout和for循环 使用时变量的问题_第1张图片
2. for循环和setTimeout搭配使用时出现的问题

想每隔100ms打印一次i的值,每次i值应该变化,结果却是三次i的值都是3,也就是都是最后一次for循环i的值,i的值为循环结束的值(注:循环结束时值并不是2而是3)

例子:
js setTimeout和for循环 使用时变量的问题_第2张图片

3. 问题原因

原因是上面讲的setTimeout运行机制的问题:定时函数被加入执行队列,等主程序运行完毕时,此时再调用定时函数,i的值已经变为3,三次的定时函数都会共用i=3这个值

4. 解决方法

对setTimeout进行封装,目的是要每次调用定时函数都有自己的私有变量值。其实就是作用域的问题,把这个问题搞清楚,就可以解决这个问题。

例子:
js setTimeout和for循环 使用时变量的问题_第3张图片

你可能感兴趣的:(javascript,前端)