function useTime() {
for (var i=0;i<1000000000;i++) {
i++;
}
}
// --------------------------------
console.log(1);
useTime();
setTimeout('console.log(2)', 6000);
// --------------------------------
console.log(3);
useTime();
setTimeout('console.log(4)', 4000);
// --------------------------------
console.log(5);
useTime();
setTimeout('console.log(6)', 2000);
console.log(7);
// 执行顺序1-3-5-7-2-4-6
我对执行顺序没有异议。
关键是执行结果的时间引起了我的注意,上图:
先理解1-3-5-7的执行。
这里没有问题,执行循环体需要花费大约1秒
的时间。
再来看7-6
这里应该是转折点,可以看出从7-6花费2秒
时间,非常准确,因为我们设置的也是2秒
。
继续看6-4和4-2
唉幺,什么鬼哦,这怎么是1.2秒
哦,不应该是好好的设置的2秒
么。。
这是第一个问题,第二个问题是图上的VM458*
是什么东东?虚拟机么。。
一共两个问题,请知道的兄弟给兄弟指点一下,感激不尽。
首先useTime我测试执行时间
然后给你分析代码
首先 1 3 5 7没有解释的原因吧。
1是第一个加入到函数调用队列中的然后执行0.5秒左右的耗时函数开始进行第一个settimeout是6秒后执行,
然后输出3在执行0.5秒左右的耗时函数进行第二个settimeout函数4秒后执行这时在距离上一个只过去了0.5秒左右
接着是5在执行0.5秒左右的耗时函数第三个settimeout函数2秒之后执行这时距离第一个过去了1秒左右第二个过去了0.5秒左右
接着输出7,只是第一个还差5秒左右执行第二个还差3.5秒左右执行而第三个只差2秒执行
再有就是js是单线程的所以settimeout到时间后不会立刻执行得等执行队列为空的时候才执行
那个VM应该就是chrome的虚拟机了
1)
//假设当前的时间点为T
function useTime() {
for (var i=0;i<1000000000;i++) {
i++;
}
}
// --------------------------------
console.log(1);
useTime();
//T+1
//理论上从T+7后运行
setTimeout('console.log(2)', 6000);
// --------------------------------
console.log(3);
useTime();
//T+2
//理论上从T+6后运行
setTimeout('console.log(4)', 4000);
// --------------------------------
console.log(5);
useTime();
//T+3
//理论上T+5后运行
setTimeout('console.log(6)', 2000);
console.log(7);
// 执行顺序1-3-5-7-6-4-2
发现没有6、4、2之间的实际时间间隔在1秒左右,差不多就是也就是useTime+console.log执行时间
setTimeout的添加到事件队列的计时点为执行setTimeout的时间点而不是当前事件循环结束的时间点
2)VM* 因为你的setTimeou指定的为一个字符串,VM需要将其编译为一个函数
姑其结果信息由VM输出而不是当前页面
你的5-7 只有0.8秒并不是1秒整 4什么时候输出你要跟5比,不能跟6或者7比
因为4的setTimeout是跟5几乎同时的, 然后useTime 0.8秒
之后 才开始6的setTimeout2秒
,当过了2秒输出6的时候, 实际上4那个任务 已经过了2.8秒,当然是还有1.2秒后触发了