关于setTimeout的运行机制

来源:6-9 项目名称动画

Xuewa

2016-07-07

h5Component.on('onLoad',function(){	
var s=0;
for(i=0;i<100;i++){
setTimeout(function(){
s+=0.01;
draw(s);
},i*10+500);//延时.5s
}
});

setTimeout第二个参数,(i*10+500),这个时间是什么时候开始算起的?按理说,每次setTimeout的间隔的时间是不一样的,但是,当我把第二个参数设成(i*1000+500)时,我却发现它们是每隔1s进行下一个动画。所以,想知道setTimeout是什么时候开始算时间的?
写回答

2回答

Lyn

2016-07-08

其实这块代码并没有什么特殊的,这段代码展开看看

var s=0 ;

// -------------- 展开之前,先把 setTimeout 里面的函数拿出来

var func = function () {
    s += 0.01; // 函数内部,只引用了 变量 s ,反正是会执行100次,那 s 一定是 [ 0 , 0.01 , 0.02 ... 1 ]
    draw(s);
};

for (i = 0; i < 100; i++) {
    setTimeout(func , i * 10 + 500);
}


// -------------- 手动展开 for 循环

setTimeout(func , 1 * 10 + 500); //延时.51s
setTimeout(func , 2 * 10 + 500); //延时.52s
setTimeout(func , 3 * 10 + 500); //延时.53s
setTimeout(func , 4 * 10 + 500); //延时.54s
// ...
setTimeout(func , 100 * 10 + 500); //延时1.50s

// 就这样执行了100次函数 func 而已


0
2
Xuewa
非常感谢!
2016-09-29
共2条回复

益铭

2016-07-08

都是同时算起的,事件是你预先定义的,浏览器会先解析,相当于定义了一个延时执行的队列,当事件被触发时每个都被通知到准备开始执行,然后按自己的延时先后执行。做个比喻,就好像军训里的报数,我们被教导怎么报数(事件定义),然后等到教官发布命令“报数”(事件触发),我们就开始挨个喊自己的数字。

0
0

Web App用组件方式开发全站

用HTML5/CSS3/JS流行技术,实现移动端可视化数据报告

3164 学习 · 516 问题

查看课程