为什么在javascript中不执行setTimeout

为什么在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语句,并且不再休眠 有

我有一个在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语句,并且不再休眠


有人能告诉我原因吗? 提前感谢。

可能正在调用
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秒钟后,该函数将再次调用setting
is_sleep
返回
true

非常感谢。你能告诉我为什么“睡眠(时间)”中的时间不是时间范围吗?即使它起作用了,我也不明白,:-)@ywenbo:当然。当您将字符串作为参数传递给
setTimeout
时,当超时消失时,它将
eval
它在
窗口的范围内<代码>时间
不在
窗口
的范围内;它将在
睡眠
现在不可访问的范围内。如果使用闭包,它将继承定义它的范围。如果您使用第二种方法,那么它将通过
sleep
作为参考,并告诉
setTimeout
time
作为参数传递给它。非常有力和清晰的解释,您很好,很好,我非常感谢您的帮助。