这个javascript代码有什么问题

时间:2011-11-22 15:36:32

标签: javascript

在下面的代码中,我试图在用户点击文档时显示警告。由于我已经用括号做了doAlert(),代码在文档加载和警报时运行而没有发生任何事件但如果我只是

  

doAlert

单击文档时似乎会响应。那么,我是否应该在没有括号的情况下调用javascript中的函数或者这样做的想法是什么。如果我将参数传递给函数怎么办?

<!doctype html>
    <html>
    <head>
    <script>
    function doAlert(){
        alert("Hello");
    }
    function init(){
        document.onclick = doAlert();
    }
    window.onload = init();
    </script>
    </head>
    <body>

</body>
</html>

4 个答案:

答案 0 :(得分:8)

如果foo是一个函数,那么bar = foo会将该函数分配给变量bar,但bar = foo()立即调用该函数并将其返回值分配给bar

事件处理程序通过被赋予一个在事件发生时将被调用的函数来工作。如果你立即运行该函数,那么它的返回值必须是你想要在事件发生时运行的函数(在这种情况下,doAlertinit的返回值是undefined )。

答案 1 :(得分:7)

document.onclick被设置为doAlert的 return 而不是doAlert函数本身。

您的代码应如下所示:

<!doctype html>
    <html>
    <head>
    <script>
    function doAlert(){
        alert("Hello");
    }
    function init(){
        document.onclick = doAlert;
    }
    window.onload = init;
    </script>
    </head>
    <body>

</body>
</html>

答案 2 :(得分:5)

当你调用一个函数时,你会得到它的返回值。

window.onload = init();

这会运行init()并将window.onload设置为其返回值undefined

您需要像这样设置:

window.onload = init;

现在window.onload设置为函数init,在需要之前不会运行。

如果您想传递参数,例如在onClick中,您可以这样做:

document.onclick = function(){
    doAlert('Clicked');
};

这将onClick设置为匿名函数,该函数调用所需的函数。或者,您可以使用闭包:

function doAlert(param){
  return function(){
    alert(param);
  };
};

document.onClick = doAlert('Hello World');

doAlert被调用,onClick被设置为其返回值,这是一个函数(在这种情况下是一个警告'Hello World')。

答案 3 :(得分:4)

Javascript中的函数是对象,可以像任何其他变量一样传递。在您的情况下,doAlert只是对函数的引用。为了调用此引用指向的函数,您需要使用括号:doAlert()

document.onclick方法应该是一个函数引用,因此您可以为它指定一个函数引用,如下所示:document.onclick = doAlert。使用您的语法,您可以将doAlert()的调用结果分配给document.onclick,这是不正确的。

知道了吗? :)