setTimeout(“fn(x)”)无法正常工作

时间:2013-01-24 07:18:05

标签: javascript callback settimeout

我有一个计时器功能,每隔2秒弹出一个文本'hello,welcome'。此外,我还有一个清除定时器间隔的功能,以便在第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 个答案:

答案 0 :(得分:3)

  

但是当我使用settimeout函数

时,弹出框显示不会停止
setTimeout("clearInterval(x);",10000);

这是因为当您评估该字符串时,未正确捕获变量“x”。它可能指向window.x(而不是包含间隔计时器ID的本地变量)。

尽管工作示例中的闭包已捕获了正确的x

避免eval的另一个原因。

您的警报尚未出现此问题,因为它没有引用任何变量,但我建议您将其更改为关闭(“函数”)表单。

答案 1 :(得分:1)

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

或者,但不是优选的,我相信你可以做到这一点:

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

但请注意,在其他情况下(其他方法调用),此连接可能不同或不可能

答案 2 :(得分:0)

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

传递字符串文字时,将对其进行评估,但范围将丢失。

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

答案 3 :(得分:-1)

工作示例 Here 我已经定制了你的代码,它工作正常。

  1. 将x变量设为全局。
  2. var t= setTimeout(' clearInterval(x);' ,1501);设置临时变量以捕获setTimeout,这是语义学。