在下面的代码中,我试图在用户点击文档时显示警告。由于我已经用括号做了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>
答案 0 :(得分:8)
如果foo
是一个函数,那么bar = foo
会将该函数分配给变量bar
,但bar = foo()
将立即调用该函数并将其返回值分配给bar
。
事件处理程序通过被赋予一个在事件发生时将被调用的函数来工作。如果你立即运行该函数,那么它的返回值必须是你想要在事件发生时运行的函数(在这种情况下,doAlert
和init
的返回值是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
,这是不正确的。
知道了吗? :)