使用函数在setinterval javascript错误中使用函数

时间:2014-07-16 02:14:07

标签: javascript setinterval timing

我写了一个像计时器这样的简单函数 为什么这段代码不对 是说Uncaught ReferenceError:a没有定义为什么?

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;
}

3 个答案:

答案 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。隐含地,当您将字符串传递给setIntervalsetTimeout时,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,所以它不会被销毁。这是一个合适的关闭。