Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/429.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 设置超时忽略超时?(立即开火)_Javascript_Settimeout - Fatal编程技术网

Javascript 设置超时忽略超时?(立即开火)

Javascript 设置超时忽略超时?(立即开火),javascript,settimeout,Javascript,Settimeout,这是我第一次真正深入研究JavaScript。当然我以前用过,但我从来没有真正从头写过东西 无论如何,我有一个非常奇怪的问题,我希望有人能帮我解决 我正在尝试使div中的文本从黑色变为白色。简单,是吗 以下代码起作用。它会将颜色更改为白色,但是,500毫秒的设置超时时间将被忽略 如果您使用Chrome并查看JS控制台,您将很容易看到doFade()方法几乎是即时调用的,而不是每500毫秒调用一次 有人能解释一下吗 var started = false; var newColor; var di

这是我第一次真正深入研究JavaScript。当然我以前用过,但我从来没有真正从头写过东西

无论如何,我有一个非常奇怪的问题,我希望有人能帮我解决

我正在尝试使div中的文本从黑色变为白色。简单,是吗

以下代码起作用。它会将颜色更改为白色,但是,500毫秒的设置超时时间将被忽略

如果您使用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);
    }
}
var start=false;
var newColor;
var-div;
var hex=0;
函数fadestart(){
如果(fadestart.storedColor的类型=='undefined'){
div=document.getElementById('test');
fadestart.storedColor=div.style.color;
}
如果(!已启动){
console.log('fadestart');
newColor=fadestart.storedColor;
开始=真;
setTimeout(doFade(),500);
}
}
函数fadestop(){
console.log('fadestop');
div.style.color=fadestart.storedColor;
开始=错误;
十六进制=0;
}
函数doFade(){

如果(hex您需要去掉
doFade()
上的括号

括号立即调用函数

用这个代替:
doFade

setTimeout(doFade(), 500);
该行显示“执行
doFade()
,然后将返回的任何值传递给
setTimeout
,该值将在500毫秒后执行该返回值。”即,您正在现场调用
doFade()

跳过括号将函数传递到
setTimeout

setTimeout(doFade, 500);

我认为您应该使用
setTimeout(doFade,500);
setTimeout(“doFade()”,500);

非常确定您不需要引号。您应该能够放置doFade或“doFade”。我认为不转换字符串“doFade”甚至可能有轻微的性能优势到函数句柄。@Surreal实际上,您希望传递不带括号的函数。引用它会在全局上下文中执行传递的代码段,这可能会产生截然不同的结果。@Surreal Dreams setTimeout接受函数或要求值的字符串作为回调。Javascript中的函数是第一类对象,可以是(通常)是这样自由地传递的。由于Javascript具有难以置信的动态性,eval几乎总是可以(也应该)避免的。@akellehe、@deceze&@Angio:谢谢你纠正我的错误。我对我的答案相当有信心,但我知道如果我错了,你们会对我大发雷霆,我会学好的。:)所以,谢谢。为什么他们让它用parens立即执行?这样你就可以让另一个函数返回该函数作为动态超时?引用调用也可以,但很糟糕。有关详细信息,请参阅akellehe的答案。当然可以。我的习惯是传递函数,甚至是内联函数。但是引用它总是另一种选择e(当然在大多数情况下不是更好的选择)。不错,如果传递参数,引用函数似乎是唯一的选择。只是注意到这一个有更好的答案: