为什么在javascript中不执行setTimeout
我有一个在javascript中睡眠的函数,如下所示:为什么在javascript中不执行setTimeout,javascript,settimeout,Javascript,Settimeout,我有一个在javascript中睡眠的函数,如下所示: var is_sleep = true; function sleep(time){ if (is_sleep){ is_sleep = false; setTimeout("sleep(time)", time); }else{ is_sleep = true; } } sleep(3000); 但是,它会遍历is_sleep=true的语句,不会遍历is_sleep=false语句,并且不再休眠 有
var is_sleep = true;
function sleep(time){
if (is_sleep){
is_sleep = false;
setTimeout("sleep(time)", time);
}else{
is_sleep = true;
}
}
sleep(3000);
但是,它会遍历is_sleep=true的语句,不会遍历is_sleep=false语句,并且不再休眠
有人能告诉我原因吗? 提前感谢。可能正在调用
setTimeout
,但传递给它的字符串失败,因为范围将不再包含您正在引用的time
。尝试将该行替换为以下内容:
setTimeout(function() { sleep(time); }, time);
…它定义了一个使用正确范围的闭包。您也可以尝试以下方法:
setTimeout(sleep, time, time);
…它将把时间
作为参数传递给睡眠
运行,这意味着它不会阻止代码执行。也许您知道这一点,但该函数永远不会符合您为其选择的名称
第一次呼叫sleep(3000)
调用sleep函数,使is_sleep
变量false
,设置计时器,然后立即返回代码执行(到sleep(3000);
;)之后的任何值)
如果正确调用了
setTimeout
(setTimeout(sleep,time,time);
),3秒钟后,该函数将再次调用settingis_sleep
返回true
非常感谢。你能告诉我为什么“睡眠(时间)”中的时间不是时间范围吗?即使它起作用了,我也不明白,:-)@ywenbo:当然。当您将字符串作为参数传递给setTimeout
时,当超时消失时,它将eval
它在窗口的范围内<代码>时间
不在窗口
的范围内;它将在睡眠
现在不可访问的范围内。如果使用闭包,它将继承定义它的范围。如果您使用第二种方法,那么它将通过sleep
作为参考,并告诉setTimeout
将time
作为参数传递给它。非常有力和清晰的解释,您很好,很好,我非常感谢您的帮助。