我有一个计时器功能,每隔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>
答案 0 :(得分:3)
但是当我使用settimeout函数
时,弹出框显示不会停止
setTimeout("clearInterval(x);",10000);
这是因为当您评估该字符串时,未正确捕获变量“x”。它可能指向window.x
(而不是包含间隔计时器ID的本地变量)。
尽管工作示例中的闭包已捕获了正确的x
。
避免eval
的另一个原因。
您的警报尚未出现此问题,因为它没有引用任何变量,但我建议您将其更改为关闭(“函数”)表单。
答案 1 :(得分:1)
我确实相信,当您为setInterval
或setTimeout
的第一个参数指定字符串时,它将在特定时间/间隔以eval
执行。因此,它在全球范围内运行。在您的情况下,x
在全局范围内不可用...它是testclear
函数内部的局部变量。将函数作为第一个参数传递给setInterval
或setTimeout
可以保护您最初使用的范围(在testclear
函数内)。
或者,但不是优选的,我相信你可以做到这一点:
setTimeout("clearInterval(" + x + ");",10000);
但请注意,在其他情况下(其他方法调用),此连接可能不同或不可能
答案 2 :(得分:0)
这是因为x
是函数testclear()
的本地。当您将函数传递给setTimeout时,它将获得与其写入的范围相同的范围,因此将识别x
。
传递字符串文字时,将对其进行评估,但范围将丢失。
如果x
是全局变量,它也将“有效”,但这不是一个好习惯。
答案 3 :(得分:-1)
工作示例 Here 我已经定制了你的代码,它工作正常。
var t= setTimeout(' clearInterval(x);' ,1501);
设置临时变量以捕获setTimeout,这是语义学。