2011-11-22 55 views
2

在下面的代码中,我试图在用户单击文档时显示警报。正如我使用圆括号做了doAlert(),代码在文档加载并警告事件发生,但如果我这样做只是此javascript代码有什么问题

doAlert

看来,当我点击该文件作出回应。那么,我是否应该在没有括号的情况下调用javascript中的函数,或者这样做的想法是什么。如果我要将参数传递给函数,该怎么办?

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

</body> 
</html> 

回答

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')。

+1

好的解释...现在很清楚。当我为事件设置功能时,我正在调用函数。很有帮助。谢谢 – Sandeep

+0

@疯狂-36:没问题。 JavaScript中的函数可以视为变量,这很奇怪。这是因为'function a(){}'和'var a = function(){}'是一样的。 –

8

如果foo是一个函数,然后bar = foo将这个函数赋值给变量bar,但bar = foo()立即通话功能及其返回值分配给bar代替。

事件处理程序通过提供将在事件发生时将被调用的函数来工作。如果立即运行函数,那么它的返回值需要是事件发生时要运行的函数(在这种情况下,doAlertinit的返回值是undefined)。

+0

Quentin有它的权利,你的代码正在执行调用该函数,而不是分配它作为处理程序。 –

+0

更容易理解,但纠结了我...谢谢 – Sandeep

7

document.onclick被设置为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

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

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

Got it? :)

+0

谢谢,现在明白了... – Sandeep