setTimeout忽略超时?(立即开火)

Jon*_* H. 30 javascript settimeout

这是我第一次真正深入了解JavaScript.当然我以前用过它,但我从来没有真正从头开始写任何东西.

无论如何,我有一个非常奇怪的问题,我希望有人可以为我找到.

我正在尝试将文本从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);
    }
}
Run Code Online (Sandbox Code Playgroud)

Kea*_*her 59

你需要摆脱括号doFade().

括号立即调用该函数.

只需使用它: doFade

  • @Surreal Dreams setTimeout接受函数**或**作为回调eval'd的字符串.Javascript中的函数是第一类对象,可以(通常是)自由地传递.由于Javascript具有令人难以置信的动态性,因此几乎可以(并且应该)避免使用eval. (6认同)
  • @Surreal实际上,你想传递没有括号的函数.引用它会在全局上下文中执行传递的代码片段,这可能会产生截然不同的结果. (3认同)
  • 很确定你不需要引号。您应该能够放置 doFade 或“doFade”。我认为不将字符串“doFade”转换为函数句柄可能会带来轻微的性能优势。 (2认同)
  • @akellehe,@ deceze&@ Angio:谢谢你纠正我.我觉得*对我的答案有合理的信心,但是我知道如果我错了,你们都会在我身边,我会正确地学习它.:) 那谢谢啦. (2认同)

dec*_*eze 21

setTimeout(doFade(), 500);
Run Code Online (Sandbox Code Playgroud)

这一行表示"执行doFade(),然后传递它返回的任何值setTimeout,这将在500毫秒后执行此返回值." 也就是说,你doFade()当场就在那里打电话.

跳过括号将函数传递setTimeout:

setTimeout(doFade, 500);
Run Code Online (Sandbox Code Playgroud)


归档时间:

查看次数:

20822 次

最近记录:

12 年,10 月 前