为什么这个“未捕获的ReferenceError:tempo未定义”错误?

我有以下代码:

$("#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它会从时间开始,所以它的工作。

因为全局范围(或​​停止点击处理程序可以到达的任何范围)中不存在变量tempo

在函数内部声明变量时,变量在函数返回时被删除:

 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 

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

 var bar = null; function foo() { bar = 1; } foo(); console.log(bar); // prints 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; } 

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