js函数调用的一个疑问

这是一个很简单的数字时钟js程序。

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>    
        <script>
        function displayTime(){
            var elt=document.getElementById('clock');
            var now=new Date();
            elt.innerHTML=now.toLocaleTimeString();
            setTimeout(displayTime,1000);
        }
        window.onload=displayTime;
        </script> 
    </head>
    <body>        
        <h1>Digital Clock</h1>
        <span id="clock"></span>
    </body>
</html>

我想问的是调用函数的语句:window.onload=displayTime;为什么不能是:window.onload=displayTime();为什么加括号就不对呢?

阅读 2.8k
4 个回答

不加括号是将window.onload指向了displayTime,网页加载完执行函数。
加括号之后就直接执行displayTime函数,将函数的返回结果赋给了window.onload。

首先,建议用setInterval,而不是循环创建setTimeout。

window.onload 是一个事件,window.onload 事件被触发的时候,会执行其绑定的函数,也就是说什么时候执行并不是我们决定的,而是浏览器决定的,我们只需要绑定函数即可:

window.onload = function() {};

这个问题其实就是看看你的调用这个函数本身,还是取得函数返回的值,例如

function fun(){
    return 5
}
var a=fun    //表示把函数名fun这个指针拷贝一份给变量a  就是将函数名称fun赋值给a
var b=fun() //如果函数名后面加上圆括号就表示立即调用(执行)这个函数里面的代码(花括号部分的代码)

回到咱们这个问题 :首先window.onload是一个window下的函数调用,我们将displayTime这个函数给onload,其次如果是displayTime()的话,是将displayTime这个函数执行的结果赋值给了window.onload
这样是不合适的。

这是我的理解,应该对你有帮助

你可以这样理解,window.onload 本身也是一个函数(类型),所以你要把一个函数赋值给他,浏览器会自己偷偷地调用 window.onload()。如果你的 displayTime 返回了一个函数,那么也可以用 displayTime()
比如这样:

function displayTime(){
  return function() {
    var elt=document.getElementById('clock')
    var now=new Date()
    elt.innerHTML=now.toLocaleTimeString()
    setTimeout(displayTime,1000)
  }
}
window.onload = displayTime()
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题