为什么这个“未捕获的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是一个异步调用。