首页 > setTimeout的问题。。

setTimeout的问题。。

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秒后触发了

【热门文章】
【热门文章】