我正在尝试建立一个计时器。请比较两种情况(第一种有效,第二种无效):
内联javascript http://jsfiddle.net/x7xhA/
非内嵌javascript http://jsfiddle.net/x7xhA/1/
问题是什么?
最佳答案
这是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);
}