为什么这个"未捕获的ReferenceError:没有定义速度"错误?

时间:2016-07-30 13:59:46

标签: javascript jquery

我已获得以下代码:

$("#avvia_cronometro").click(function() {
    var tempo = setInterval(function() {
        cronometro();
        $("#tempo_cronometro").html((h)+":"+(min)+":"+(sec));
    }, 1000);
});
$("#stop_cronometro").click(function() {
    clearInterval(tempo);
});

function cronometro() {
    if (sec == 59) {
        min +=1;
        if (min == 59) {
            h+=1;
            min=0;
        }
        sec=0;
    }
    sec+=1;
}

当我点击#stop_cronometro时,它无法正常工作,并说:

Uncaught ReferenceError: tempo is not defined

我该如何解决?

如果我点击#avvia_cronometro,它会以时间开始,以便它可以正常工作。

3 个答案:

答案 0 :(得分:1)

好吧,它发生的原因是变量范围在单独的函数内部,当一个变量在函数内部声明时,它只能访问它自己和子函数。

在你的情况下,我建议你制作"节奏"变量全局:

var tempo = null;
$("#avvia_cronometro").click(function() {
    tempo = setInterval(function() {
        cronometro();
        $("#tempo_cronometro").html((h)+":"+(min)+":"+(sec));
    }, 1000);
});
$("#stop_cronometro").click(function() {
    clearInterval(tempo);
});

function cronometro() {
    if (sec == 59) {
        min +=1;
        if (min == 59) {
            h+=1;
            min=0;
        }
        sec=0;
    }
    sec+=1;
}

答案 1 :(得分:1)

因为全局范围(或​​停止点击处理程序可以达到的任何范围)中不存在变量.POSITION, .links, .links a i::after {position: absolute;} .links a i {position: relative;} .CO-ORDINATES, .links {top: 40%; left: 50%;} .links a i {z-index: 100;} .links a i::after {top: -7px; left: -7px; z-index: -1;} .WIDTH_HEIGHT, .links {width: 9em; height: 4em;} .links a i::after {width: 30px; height: 30px;} .MARGIN_PADDING, .links {margin: -20px 0 0 -45px;} .links a i {margin: 0 13px;} .TEXT-COLOR, .links a i {color: #68c3a3;} .links a i:hover i {color: #fff;} .TEXT-PRESENTATION, .links a i {font-size: 16px;} .BACKGROUND, .links a:hover i:hover {background-color: #68c3a3;} .BORDER, .links a i::after {border: 1px solid #68c3a3; border-radius: 3px;} .MISCELLANEOUS, .links {opacity: 0;} .PSEUDO-ELEMENTS, .links a i::after {content: '';} .TRANSFORM, .links { -webkit-transform: translate(0, -50px); -moz-transform: translate(0, -50px); -ms-transform: translate(0, -50px); -o-transform: translate(0, -50px); transform: translate(0, -50px); } .links a i::after { -webkit-transform: rotate(45deg); -moz-transform: rotate(45deg); -ms-transform: rotate(45deg); -o-transform: rotate(45deg); transform: rotate(45deg); }

当在函数内声明一个带有tempo的变量时,该函数返回时变量被删除:

var

如果您需要全局变量,请在没有function foo () { var bar = 1; } foo(); console.log(bar); // uncaught reference error - "bar" doesn't exist

的情况下使用它
var

但是,我一般不会推荐这个,因为它对未来的维护者来说似乎是个错误。相反,在全局范围内明确声明全局变量以清楚地表明您的意图:

function foo () {
    bar = 1;
}
foo();
console.log(bar); // prints 1

答案 2 :(得分:0)

因为您在开始执行之前清除间隔。在if中处理未定义的节奏。 SetInterval是一个异步调用。