2010-11-08 68 views
25

这是我第一次真正深入JavaScript。当然,我以前使用过它,但我从来没有从头开始写任何东西。setTimeout忽略超时? (立即着火)

无论如何,我有一个很奇怪的问题,我希望有人能找到我。

我试图使文本从div淡出从黑色到白色。简单,是吗?

以下代码作品。它会将颜色更改为白色,但是,500ms的setTimeout时间将被忽略。

如果您使用Chrome并查看JS控制台,您将很容易看到doFade()方法几乎是瞬间调用,而不是每500毫秒。

任何人都可以解释这一点吗?

var started = false; 
var newColor; 
var div; 
var hex = 0; 

function fadestart(){ 
    if (typeof fadestart.storedColor == 'undefined') { 
     div = document.getElementById('test'); 
     fadestart.storedColor = div.style.color; 
    } 
    if(!started){ 
     console.log('fadestart'); 
     newColor = fadestart.storedColor; 
     started = true; 
     setTimeout(doFade(), 500); 
    } 
} 

function fadestop(){ 
    console.log('fadestop'); 
    div.style.color = fadestart.storedColor; 
    started = false; 
    hex = 0; 
} 

function doFade(){ 
    if(hex<=238){ 
     console.log(hex); 
     hex+=17; 
     div.style.color="rgb("+hex+","+hex+","+hex+")"; 
     setTimeout(doFade(), 500); 
    } 
} 

回答

48

您需要去掉doFade()上的括号。

圆括号立即调用该函数。

在代替只需使用这样的:doFade

+0

其实,你想 'dofade()' 作为一个字符串,用引号。不过,你有根本原因。 – 2010-11-08 02:03:12

+0

是'func'求值到函数本身,而'func()'调用函数并计算其返回值。 – 2010-11-08 02:03:46

+1

很确定你不需要报价。你应该能够把doFade或“doFade”。我认为,甚至可能会略微提高性能,以便不将字符串“doFade”转换为函数句柄。 – KeatsKelleher 2010-11-08 02:04:48

20
setTimeout(doFade(), 500); 

这行说“执行doFade(),然后传进去的值返回到setTimeout,这将在500毫秒之后执行该返回值。”也就是说,您当场打电话给doFade()

跳过括号的功能setTimeout

setTimeout(doFade, 500); 
4

我认为你应该使用setTimeout(doFade, 500);setTimeout("doFade()", 500);

+1

引用的调用也可以,但是很糟糕。有关详情,请参阅akellehe的答案。 – ThiefMaster 2010-11-08 02:08:10

+0

当然可以。我的习惯是传递一个函数,甚至是一个内联函数。但引用它总是另一种选择(当然在大多数情况下不是更好的选择)。 – PeterWong 2010-11-08 02:14:55

+0

不错,引用的函数似乎是传递参数的唯一选择。 – asoundmove 2016-10-05 13:08:27