function timeee(sec) {
document.getElementById("main").innerHTML = sec;
--sec;
if (sec == -1) {
clearInterval(cleartext);
}
}
function timer() {
var a = document.getElementById("time").value;
var cl = setInterval("timeee(a)", 1000);
window.cleartext = cl;
}
答案 0 :(得分:0)
正如您在this other question中所看到的,当您将setInterval
与字符串一起使用时,该函数将在全局范围内运行。但是,您的a
变量仅在本地设置,因此timeee()
函数无法看到它。
尝试使用:
function timer() {
var a = document.getElementById("time").value;
var cl = setInterval(function() { timeee(a) }, 1000);
window.cleartext = cl;
}
或者,如果您确实想要使用字符串,请将a
定义为global variable:
var a;
function timer() {
a = document.getElementById("time").value;
var cl = setInterval("timeee(a)", 1000);
window.cleartext = cl;
}
答案 1 :(得分:0)
为什么?
范围。
考虑:
function timer() {
var a = document.getElementById("time").value;
var cl = setInterval("timeee(a)", 1000);
window.cleartext = cl;
}
a 是本地范围的,但 timeee(a)将从全局范围调用。它无法访问 a 。尝试:
var cl = setInterval(function(){timeee(a)}, 1000);
所以你要在闭包中保留 a 的值。请注意,每次都会传递 a 的相同值,因此您也需要解决该问题(Banana的答案是一个选项)。
答案 2 :(得分:0)
经过一番思考后,我最好的猜测是对“a”的引用不是一个合适的闭包。
以这种方式思考:您将字符串传递给setInterval
。隐含地,当您将字符串传递给setInterval
或setTimeout
时,eval()
somewhere is being called.。因为在运行时,解释器不知道变量a
正在其他地方使用,它会抛弃它。然后,当执行eval
时,参数a
不再存在。
现在看一下你的问题的解决方案:
function timer() {
var a = document.getElementById("time").value;
var cl = setInterval(function() { timeee(a) }, 1000);
window.cleartext = cl;
}
因为解释器知道稍后仍会使用a
,所以它不会被销毁。这是一个合适的关闭。