为何时间都一样

下面的两段代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
var arr=[];
var a = 10;
function run(){
a-- && (arr.push(+new Date()),run());
}
run()

//和

var arr=[];
a=10;
setTimeout(function(){
if( a-- && arr.push(+new Date()) ){
arguments.callee();
}
},0);

/*
这两段代码分别在控制台输出arr结果,原以为是不同的,结果是一样的
>arr
[1404582518336, 1404582518336, 1404582518336, 1404582518336, 1404582518336, 1404582518336, 1404582518336, 1404582518336, 1404582518336, 1404582518336]
*/

于是又试了下面的方式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
var arr=[];
var a = 10;
function run(){
a-- && (arr.push(+new Date()),setTimeout(run,0) ) || ( console.log(arr), dengcha(arr) );
}
setTimeout(run,0);

function dengcha(arr){
var jiange = [];
for(var i=0;i<arr.length-1;i++){
jiange.push(arr[i+1]-arr[i]);
}
alert(jiange);
}

记得javascipt 高级程序设计里面说,setTimeout 最小间隔时间 不同浏览器有不相同的结果。
于是将上面的代码分别运行在IE8 和 chrome中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
//IE
(function(sec){
var arr=[];
var a = 10;
function run(){
a-- && (arr.push(+new Date()),setTimeout(run,sec) ) || ( console.log(arr), dengcha(arr) );
}
setTimeout(run,sec);

function dengcha(arr){
var jiange = [];
for(var i=0;i<arr.length-1;i++){
jiange.push(arr[i+1]-arr[i]);
}
alert(jiange);
}
})(0)
弹出结果一般都是 15 16 15 15 16 。。。 偶尔蹦出个31左右


//同样的代码在chrome下的表现 运行了几次
[5, 4, 5, 5, 5, 5, 5, 5, 5]
[5, 2, 2, 11, 5, 5, 7, 5, 5]
[17, 5, 8, 5, 5, 7, 5, 5, 7]
[3, 3, 17, 11, 5, 7, 17, 4, 5]
[5, 3, 3, 7, 5, 19, 8, 5, 5]
[3, 20, 12, 5, 5, 5, 15, 5, 7]

IE8中 发现 只要毫秒数设置在15以内(包括15)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
(function(sec){
var arr=[];
var a = 10;
function run(){
a-- && (arr.push(+new Date()),setTimeout(run,sec) ) || ( console.log(arr), difference(arr) );
}
setTimeout(run,sec);

function difference(arr){//命名什么的最麻烦了
var jiange = [];
for(var i=0;i<arr.length-1;i++){
jiange.push(arr[i+1]-arr[i]);
}
alert(jiange);
}
})(15)

那么他们的运行间隔一般都是 15 16 15 15 16 。。。 偶尔蹦出个31左右
但是如果设置了 16~31(包括31) 那么结果一般在 31 32 31 31 32 。。。
32 时 31 47,,又不同了。。。

为了一致性,建议还是用15ms吧(chrome 和 IE 差不多,不过这么细微的差别,也没人会注意),结果可能跟电脑也有关系 - -。

周末就这么过去了 (⊙o⊙)…

来一段测试代码吧, 在自己的电脑上运行看看效果,记录了setTimeout 0 到 50毫秒,调用的时间间隔。这是在控制台跑的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
var cache = [];
for(var i = 0;i < 50;i++){
(function(sec){
var arr=[];
var a = 10;
function run(){
a-- && (arr.push(+new Date()),setTimeout(run,sec) ) || ( console.log(arr), difference(arr) );
}
setTimeout(run,sec);

function difference(arr){//命名什么的最麻烦了
var spacing = [];
for(var i=0;i<arr.length-1;i++){
spacing.push(arr[i+1]-arr[i]);
}
cache[sec] = spacing;
}
})(i)
}
setTimeout(function(){
for(var o in cache){
console.log("setTimeout设置为"+o+"毫秒时,实际间隔"+cache[o]);
}
},3000)


//chrome 下的输出
setTimeout设置为0毫秒时,实际间隔2,4,2,7,6,6,5,7,16 VM594:23
setTimeout设置为1毫秒时,实际间隔2,4,2,7,6,6,5,7,16 VM594:23
setTimeout设置为2毫秒时,实际间隔2,4,9,6,6,5,7,16,6 VM594:23
setTimeout设置为3毫秒时,实际间隔4,9,6,6,5,7,16,6,4 VM594:23
setTimeout设置为4毫秒时,实际间隔4,9,6,6,5,7,16,6,4 VM594:23
setTimeout设置为5毫秒时,实际间隔6,7,6,6,5,7,16,7,6 VM594:23
setTimeout设置为6毫秒时,实际间隔9,6,6,7,6,16,6,6,7 VM594:23
setTimeout设置为7毫秒时,实际间隔9,9,8,7,17,9,7,8,7 VM594:23
setTimeout设置为8毫秒时,实际间隔9,9,8,8,16,9,10,9,9 VM594:23
setTimeout设置为9毫秒时,实际间隔9,9,10,9,13,9,10,9,9 VM594:23
setTimeout设置为10毫秒时,实际间隔10,11,10,17,12,12,10,12,11 VM594:23
setTimeout设置为11毫秒时,实际间隔12,12,17,12,12,13,13,13,12 VM594:23
setTimeout设置为12毫秒时,实际间隔14,14,13,12,13,12,13,13,12 VM594:23
setTimeout设置为13毫秒时,实际间隔14,14,13,15,13,14,15,15,14 VM594:23
setTimeout设置为14毫秒时,实际间隔14,14,15,14,15,15,14,15,16 VM594:23
setTimeout设置为15毫秒时,实际间隔17,24,16,15,15,17,23,15,17 VM594:23
setTimeout设置为16毫秒时,实际间隔17,24,16,18,16,16,20,17,17 VM594:23
setTimeout设置为17毫秒时,实际间隔17,24,19,18,17,18,19,20,18 VM594:23
setTimeout设置为18毫秒时,实际间隔19,22,19,18,20,18,18,18,20 VM594:23
setTimeout设置为19毫秒时,实际间隔21,19,20,20,21,23,20,20,23 VM594:23
setTimeout设置为20毫秒时,实际间隔21,22,20,21,20,21,20,22,21 VM594:23
setTimeout设置为21毫秒时,实际间隔22,22,22,23,21,22,21,23,21 VM594:23
setTimeout设置为22毫秒时,实际间隔34,23,24,23,22,24,23,24,24 VM594:23
setTimeout设置为23毫秒时,实际间隔34,23,24,23,24,25,23,24,24 VM594:23
setTimeout设置为24毫秒时,实际间隔34,25,26,25,25,26,27,25,25 VM594:23
setTimeout设置为25毫秒时,实际间隔32,25,25,25,26,25,27,25,25 VM594:23
setTimeout设置为26毫秒时,实际间隔32,28,26,32,27,26,26,26,26 VM594:23
setTimeout设置为27毫秒时,实际间隔32,28,29,29,27,28,29,27,27 VM594:23
setTimeout设置为28毫秒时,实际间隔29,28,29,29,29,34,29,30,42 VM594:23
setTimeout设置为29毫秒时,实际间隔29,31,29,31,29,33,30,30,37 VM594:23
setTimeout设置为30毫秒时,实际间隔32,32,32,31,31,31,31,31,31 VM594:23
setTimeout设置为31毫秒时,实际间隔33,31,32,32,33,33,33,33,33 VM594:23
setTimeout设置为32毫秒时,实际间隔33,33,33,34,32,32,33,47,34 VM594:23
setTimeout设置为33毫秒时,实际间隔33,33,33,36,38,34,34,34,33 VM594:23
setTimeout设置为34毫秒时,实际间隔36,35,39,34,36,35,36,36,34 VM594:23
setTimeout设置为35毫秒时,实际间隔36,38,36,36,37,38,36,37,37 VM594:23
setTimeout设置为36毫秒时,实际间隔38,38,37,38,36,38,47,37,44 VM594:23
setTimeout设置为37毫秒时,实际间隔39,38,37,38,39,39,38,39,41 VM594:23
setTimeout设置为38毫秒时,实际间隔39,38,40,39,39,39,40,40,40 VM594:23
setTimeout设置为39毫秒时,实际间隔41,39,40,46,40,40,41,41,39 VM594:23
setTimeout设置为40毫秒时,实际间隔41,42,41,43,41,42,41,42,42 VM594:23
setTimeout设置为41毫秒时,实际间隔41,42,41,43,41,42,41,42,42 VM594:23
setTimeout设置为42毫秒时,实际间隔42,42,44,42,44,53,44,43,42 VM594:23
setTimeout设置为43毫秒时,实际间隔44,44,43,44,44,48,43,43,45 VM594:23
setTimeout设置为44毫秒时,实际间隔44,44,45,45,45,45,45,44,45 VM594:23
setTimeout设置为45毫秒时,实际间隔47,52,45,47,46,46,46,46,46 VM594:23
setTimeout设置为46毫秒时,实际间隔47,47,48,48,61,47,47,47,48 VM594:23
setTimeout设置为47毫秒时,实际间隔47,47,48,48,61,47,48,49,48 VM594:23
setTimeout设置为48毫秒时,实际间隔48,50,52,48,54,49,50,49,50 VM594:23
setTimeout设置为49毫秒时,实际间隔50,50,53,50,49,51,51,49,51

IE 下面貌似很有规律,按照 16递增

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
	var logDiv = document.createElement('div');
logDiv.id = "logDiv";
document.body.appendChild(logDiv);

function log(str){
logDiv.innerHTML += str + "\r\n";
};

var cache = [];
for(var i = 0;i < 50;i++){
(function(sec){
var arr=[];
var a = 10;
function run(){
a-- && (arr.push(+new Date()),setTimeout(run,sec) ) || ( difference(arr) );
}
setTimeout(run,sec);

function difference(arr){//命名什么的最麻烦了
var spacing = [];
for(var i=0;i<arr.length-1;i++){
spacing.push(arr[i+1]-arr[i]);
}
cache[sec] = spacing;
}
})(i)
}
setTimeout(function(){
for(var o in cache){
log("setTimeout设置为"+o+"毫秒时,实际间隔"+cache[o]+"<br/>");
};
},3000)

//结果
setTimeout设置为0毫秒时,实际间隔16,15,16,15,16,16,15,16,16
setTimeout设置为1毫秒时,实际间隔16,15,16,15,16,16,15,16,16
setTimeout设置为2毫秒时,实际间隔16,15,16,15,16,16,15,16,16
setTimeout设置为3毫秒时,实际间隔16,15,16,15,16,16,15,16,16
setTimeout设置为4毫秒时,实际间隔16,15,16,15,16,16,15,16,16
setTimeout设置为5毫秒时,实际间隔16,15,16,15,16,16,15,16,16
setTimeout设置为6毫秒时,实际间隔16,15,16,15,16,16,15,16,16
setTimeout设置为7毫秒时,实际间隔16,15,16,15,16,16,15,16,16
setTimeout设置为8毫秒时,实际间隔16,15,16,15,16,16,15,16,16
setTimeout设置为9毫秒时,实际间隔16,15,16,15,16,16,15,16,16
setTimeout设置为10毫秒时,实际间隔16,15,16,15,16,16,15,16,16
setTimeout设置为11毫秒时,实际间隔16,15,16,15,16,16,15,16,16
setTimeout设置为12毫秒时,实际间隔16,15,16,15,16,16,15,16,16
setTimeout设置为13毫秒时,实际间隔16,15,16,15,16,16,15,16,16
setTimeout设置为14毫秒时,实际间隔16,15,16,15,16,16,15,16,16
setTimeout设置为15毫秒时,实际间隔16,15,16,15,16,16,15,16,16
setTimeout设置为16毫秒时,实际间隔31,31,16,31,16,31,31,16,31
setTimeout设置为17毫秒时,实际间隔31,31,32,31,31,31,32,31,31
setTimeout设置为18毫秒时,实际间隔31,31,32,31,31,31,32,31,31
setTimeout设置为19毫秒时,实际间隔31,31,32,31,31,31,32,31,31
setTimeout设置为20毫秒时,实际间隔31,31,32,31,31,31,32,31,31
setTimeout设置为21毫秒时,实际间隔31,31,32,31,31,31,32,31,31
setTimeout设置为22毫秒时,实际间隔31,31,32,31,31,31,32,31,31
setTimeout设置为23毫秒时,实际间隔31,31,32,31,31,31,32,31,31
setTimeout设置为24毫秒时,实际间隔31,31,32,31,31,31,32,31,31
setTimeout设置为25毫秒时,实际间隔31,31,32,31,31,31,32,31,31
setTimeout设置为26毫秒时,实际间隔31,31,32,31,31,31,32,31,31
setTimeout设置为27毫秒时,实际间隔31,31,32,31,31,31,32,31,31
setTimeout设置为28毫秒时,实际间隔31,31,32,31,31,31,32,31,31
setTimeout设置为29毫秒时,实际间隔31,31,32,31,31,31,32,31,31
setTimeout设置为30毫秒时,实际间隔31,31,32,31,31,31,32,31,31
setTimeout设置为31毫秒时,实际间隔31,31,32,31,31,31,32,31,31
setTimeout设置为32毫秒时,实际间隔47,31,47,47,31,47,47,31,47
setTimeout设置为33毫秒时,实际间隔47,47,47,46,47,47,47,47,47
setTimeout设置为34毫秒时,实际间隔47,47,47,46,47,47,47,47,47
setTimeout设置为35毫秒时,实际间隔47,47,47,46,47,47,47,47,47
setTimeout设置为36毫秒时,实际间隔47,47,47,46,47,47,47,47,47
setTimeout设置为37毫秒时,实际间隔47,47,47,46,47,47,47,47,47
setTimeout设置为38毫秒时,实际间隔47,47,47,46,47,47,47,47,47
setTimeout设置为39毫秒时,实际间隔47,47,47,46,47,47,47,47,47
setTimeout设置为40毫秒时,实际间隔47,47,47,46,47,47,47,47,47
setTimeout设置为41毫秒时,实际间隔47,47,47,46,47,47,47,47,47
setTimeout设置为42毫秒时,实际间隔47,47,47,46,47,47,47,47,47
setTimeout设置为43毫秒时,实际间隔47,47,47,46,47,47,47,47,47
setTimeout设置为44毫秒时,实际间隔47,47,47,46,47,47,47,47,47
setTimeout设置为45毫秒时,实际间隔47,47,47,46,47,47,47,47,47
setTimeout设置为46毫秒时,实际间隔47,47,47,46,47,47,47,47,47
setTimeout设置为47毫秒时,实际间隔62,47,47,47,47,62,47,47,47
setTimeout设置为48毫秒时,实际间隔62,63,62,63,62,63,62,63,62
setTimeout设置为49毫秒时,实际间隔62,63,62,63,62,63,62,63,62