我正在尝试建立一个计时器。请比较两种情况(第一种有效,第二种无效):
- 内联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);
}
第二个将timedCount
函数包装在 jQueryready
函数中,因此在全局范围内不可用。
固定:http: //jsfiddle.net/x7xhA/2/