为了账号安全,请及时绑定邮箱和手机立即绑定

我直接调用函数startCount()为什么不行呢?

<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>计时器</title>
</head>
<script type="text/javascript">
  var num=0;
  function startCount() {
    document.getElementById('count').value=num;
    num=num+1;
    setTimeout("startCount()",1000) 
  }
  startCount()
</script>
</head>
<body>
<form>
<input type="text" id="count" />
</form>
</body>
</html>

代码如上。

为什么把startCount()这句换成:setTimeout("startCount()",1000) 就可以?

后面这句代码的目的,实际上也是为了调用函数啊。

求大神解答~

正在回答

1 回答

js写在head里的话,因为html文档在加载的时候,是从上到下加载的,所以会先加载js,在js里加载到startCount()时,会执行startCount()函数,但在函数里有获取ID的document.getElementById('count'),而此时body里的内容还没加载,会找不到id为count的对象,所以会出错。setTimeout()这个函数不会截断加载的进程,而且setTimeout("startCount()",1000)会在一秒后执行,而在这一秒内整个文档早就加载完成了,就不会出现上边找不到的情况。所以可以成功执行。

你把script标签和里面的代码放到</body>前面,就不会出错了。如:

<!DOCTYPE HTML>

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8">

<title>计时器</title>

</head>

<body>

<form>

<input type="text" id="count" />

</form>

<script type="text/javascript">

  var num=0;

  function startCount() {

    document.getElementById('count').value=num;

    num=num+1;

    setTimeout("startCount()",1000) 

  }

  startCount()

</script>

</body>

</html>

ps:话说你js实际上不是写在head里(因为在<script>标签前head已经结束了),而是写在head和body之间了(虽然js写在哪儿都行)。

0 回复 有任何疑惑可以回复我~
#1

秋挽词

看了这么多解释为什么有两个setTimeout("startCount()",1000)的,就你的看明白了.果然放在后面的话直接调用就可以,非常感谢`但是为什么我在前面加了window.onload还是不能正常运行呢?提示startCount is not defined.
2016-12-21 回复 有任何疑惑可以回复我~
#2

CHFFOPSAIE 回复 秋挽词

startCount没有定义? 你是不是window.onload用错了,这样用试试: window.onload=function(){ var num=0; function startCount() { document.getElementById('count').value=num; num=num+1; setTimeout("startCount()",1000); } startCount(); }
2016-12-21 回复 有任何疑惑可以回复我~
#3

CHFFOPSAIE 回复 秋挽词

window.onload=function(){ startCount(); } var num=0; function startCount() { document.getElementById('count').value=num; num=num+1; setTimeout("startCount()",1000); }
2016-12-21 回复 有任何疑惑可以回复我~
#4

CHFFOPSAIE 回复 秋挽词

第一个好像不行,第二个可以。
2016-12-21 回复 有任何疑惑可以回复我~
#5

秋挽词 回复 CHFFOPSAIE

startCount();放在前面和后面有什么区别吗?我之前就是按你第一个那样写的.
2016-12-21 回复 有任何疑惑可以回复我~
#6

穿越满天星 提问者

谢谢大神!解答很明白。原来是利用了setTimeout()的滞后功能
2016-12-21 回复 有任何疑惑可以回复我~
#7

穿越满天星 提问者 回复 CHFFOPSAIE

谢谢大神!解答很明白。原来是利用了setTimeout()的滞后功能
2016-12-21 回复 有任何疑惑可以回复我~
#8

CHFFOPSAIE 回复 秋挽词

两种方法都没有错,错在setTimeout()的使用上。第一个里的startCount()函数是局部变量(在另一个函数里),第二个是全局变量。setTimeout("startCount()",1000)里的startCount带上了括号和双引号,不捕捉局部变量,而如果用setTimeout(startCount,1000)就行了,因为不带双引号就可以捕捉局部变量了。
2016-12-22 回复 有任何疑惑可以回复我~
#9

秋挽词 回复 CHFFOPSAIE

原来如此~非常感谢!!
2016-12-22 回复 有任何疑惑可以回复我~
查看6条回复

举报

0/150
提交
取消

我直接调用函数startCount()为什么不行呢?

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信