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