1

我有一个计时器功能,它每 2 秒在弹出窗口中提醒一个文本“你好,欢迎”。我还有一个功能可以清除计时器间隔,以便在第 10 秒停止弹出。

当我使用 clearInterval 函数行时,弹出框显示停止

setTimeout(function() {clearInterval(x); },10000);

但是当我使用 settimeout 函数时,弹出框显示并没有停止

setTimeout("clearInterval(x);",10000);

但是,如果我使用 settimeout 函数通过将内置函数直接定义为来显示弹出窗口 setTimeout("alert('hello, welcome');",2000); // works properly

您能否解释一下为什么上述两行的 settimeout 函数的行为不同。请在下面找到我的代码。

<html>
<head>
<script type='text/javascript' >
function testclear()
{
    var x = setInterval("alert('hello, welcome');",2000);
    setTimeout(function() { clearInterval(x); },10000);

   // setTimeout("clearInterval(x);",10000);
}
</script>
</head>
<body>
    <input id='txt' onchange='testclear()' />
</body>
</html>
4

4 回答 4

3

但是当我使用 settimeout 函数时,弹出框显示并没有停止

setTimeout("clearInterval(x);",10000);

那是因为当您评估该字符串时,变量“x”没有被正确捕获。它可能会指向window.x(而不是保存间隔计时器 id 的本地变量)。

而工作示例中的闭包已经捕获了正确的x.

另一个避免的理由eval

您的警报(还)没有这个问题,因为它没有引用任何变量,但我建议您也将其更改为闭包(“函数”)形式。

于 2013-01-24T07:22:03.803 回答
1

我确实相信,当您为setIntervalor的第一个参数指定字符串时setTimeout,它将eval在特定时间/间隔执行。因此,它在全局范围内运行。在您的情况下,x在全局范围内不可用......它是testclear函数内部的局部变量。将函数作为第一个参数传递给setIntervalsetTimeout保护您最初使用的范围(在testclear函数内部)。

或者,但不是最好的,我相信你可以这样做:

setTimeout("clearInterval(" + x + ");",10000);

但请注意,在其他情况下(其他方法调用),这种串联可能不同或不可能

于 2013-01-24T07:22:35.947 回答
0

那是因为x是函数的本地testclear()。当您将函数传递给 setTimeout 时,它将获得与写入它的范围相同的范围,因此x将被识别。

当您传递字符串文字时,它将被评估但范围丢失。

如果x将是全局变量,它也将“工作”,但这不是一个好习惯。

于 2013-01-24T07:22:34.610 回答
-1

工作示例在这里 我已经自定义了您的代码,它工作正常。

  1. 使 x 变量成为全局变量。
  2. var t= setTimeout(' clearInterval(x);' ,1501);设置 temp 变量以捕获 setTimeout ,这是语义遵循的。
于 2013-01-24T08:07:39.627 回答