我正在尝试构建一个计时器。请比较两种情况(第一种情况有效,而不是第二种情况):
有什么问题?
答案 0 :(得分:5)
这是jsFiddle的“JavaScript部分”用户常遇到的问题。你看,放入'JavaScript部分'的代码包含在一个用作load
处理程序的函数中,所以在你的第二个例子中,实际的输出结果如下:
<script type='text/javascript'>
//<![CDATA[
$(window).load(function(){
var seconds = 0;
function timedCount() {
$("#txt").val(seconds);
seconds += 1;
setTimeout("timedCount()",1000);
}
});
//]]>
</script>
现在,timedCount
不再是一个全局函数,因为它仅在load
处理程序的范围内可用,并且当您将setTimeout
与一串代码一起使用时,从全球范围进行评估。
解决此问题的方法包括:
将setTimeout
来电更改为setTimeout(timedCount, 1000);
这样做,是将实际的函数对象传递给setTimeout
。而不是每次从全局范围评估代码字符串,这基本上保留了调用函数的能力,因为范围不再重要 - 您将函数交给setTimeout
。
var seconds = 0;
function timedCount() {
$("#txt").val(seconds);
seconds += 1;
setTimeout(timedCount,1000);
}
使用timedCount
timedCount = function() { ... };
成为一个全局函数
这只会使timedCount
成为全局变量,因此当setTimeout
尝试从全局范围中评估timedCount();
时,它会成功,因为全局范围内存在timedCount
函数范围。
var seconds = 0;
timedCount = function() {
$("#txt").val(seconds);
seconds += 1;
setTimeout("timedCount();",1000);
}
答案 1 :(得分:2)
第二个函数将timedCount
函数包装在jQuery ready
函数中,因此在全局范围内不可用。