这个javascript代码有什么问题

San*_*eep 2 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>
Run Code Online (Sandbox Code Playgroud)

Que*_*tin 8

如果foo是一个函数,然后bar = foo将这个函数赋值给变量bar,但bar = foo()立即调用函数及其分配的返回值bar代替.

事件处理程序通过被赋予一个在事件发生时将被调用的函数来工作.如果您立即运行功能,那么它的返回值必须是要当事件发生时(在这种情况下两者的返回值运行功能doAlertinitundefined).


小智 7

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

您的代码应如下所示:

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

</body>
</html>
Run Code Online (Sandbox Code Playgroud)


Roc*_*mat 5

调用函数时,将获得其返回值.

window.onload = init();
Run Code Online (Sandbox Code Playgroud)

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

你需要像这样设置它:

window.onload = init;
Run Code Online (Sandbox Code Playgroud)

现在window.onload设置为该函数init,它将不会运行,直到它需要.

如果你想传递参数,比如你的传递onClick,你可以这样做:

document.onclick = function(){
    doAlert('Clicked');
};
Run Code Online (Sandbox Code Playgroud)

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

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

document.onClick = doAlert('Hello World');
Run Code Online (Sandbox Code Playgroud)

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