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

函数直接调用,为啥不行?

<!DOCTYPE HTML>

<html>

<head>

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

<title>计时器</title>


<script type="text/javascript">

  var num=0;

  function startCount() {

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

    num=num+1;

    setTimeout(startCount,1000); 

  }

//这里换成setTimeout(startCount,1000); ,可以

startCount();

</script>

</head>

<body>

<form>

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

</form>

</body>

</html>


正在回答

4 回答

那为什么setTimeout(startCount,1000); 就可以,直接调用就不行呢

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

https://img1.sycdn.imooc.com//5b83a6720001974c07530186.jpg

为了测试函数是否执行我把代码写成这样,结果是只能执行一次,而且并没有成功的获取到文本框"count"的id。

https://img1.sycdn.imooc.com//5b83a83500010dc602920074.jpg

既然没有获取到"count"的id,再看下 document.getElementById('count').value=num;那这句代码的是不是等同于null.value=null;这样的用法很明显是错误的,所以函数终止了,并没有再往下执行。为了验证我的推论,注释掉 document.getElementById('count').value=num;

https://img1.sycdn.imooc.com//5b83a81d0001d57807500180.jpg

结果是函数正常执行,只是获取不到"count"的id值,浏览器先显示https://img1.sycdn.imooc.com//5b83a9340001b58f02250053.jpg

随后动态显示https://img1.sycdn.imooc.com//5b83a8960001312104000170.jpg

可以看出只有第2次显示获取的id有值。所以我猜测在脚本内部以函数名()方式直接调用函数的话,会获取不到外部元素的id值,所以你的这段代码不能动态更新"count"文本框中的值。

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

跟我一起读_biang

如果这不是正解,希望知道原因的大佬解释下,我也很好奇。
2018-08-27 回复 有任何疑惑可以回复我~

代码没错  把js代码放在html代码的后面就可以运行

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

昵称是四声

这是为什么呢?
2018-08-06 回复 有任何疑惑可以回复我~
#2

ly今夕何夕 回复 昵称是四声

跟渲染机制有关系 我百度了一下 大概意思就是:js的下载和执行会阻塞Dom树的构建(严谨地说是中断了Dom树的更新),所以script标签放在首屏范围内的HTML代码段里会截断首屏的内容。 script标签放在body底部,做与不做async或者defer处理,都不会影响首屏时间,但影响DomContentLoad和load的时间,进而影响依赖他们的代码的执行的开始时间。 最后就是 如果不在外部引入,而在html里面写script代码的话 最好放在body底部 这样不容易出错!!!
2018-08-19 回复 有任何疑惑可以回复我~
#3

昵称是四声 回复 ly今夕何夕

谢谢!!!
2018-09-24 回复 有任何疑惑可以回复我~

在js中函数名可以把它当成指针,函数名加上括号就代表函数立即执行,这里是把startCount函数作为定时器的一个参数传入,如果加上括号函数立即执行,传入的参数就变成了函数的返回值,所以不能执行,望采纳 谢谢!。

4 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消

函数直接调用,为啥不行?

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