2013-04-29 129 views
0

我正在学习JavaScript并试图理解它。这对你来说可能很简单,但我确实需要解释。所以这里是我的java脚本文件的代码。调用javascript方法的两种方法有什么区别

function divClick(){ 
alert("Hello World!!!"); 
} 

所以,如果我这样称呼它

$(document).ready(function(){ 
$("div").click(function(){ 
    divClick(); 
});}); 

一切工作,当我点击div元素的罚款和警告框只出现。但如果我像访问它

$(document).ready(function(){ 
$("div").click(divClick());}); 

只要页面加载,警报框会自动出现。我真的无法理解,请你解释一下。如果有任何网址,我会很乐意学习它。

+0

请,以后再共享代码之前,先学会如何做正确的缩进。 http://en.wikipedia.org/wiki/Indent_style – kay 2013-04-29 23:37:43

+0

对不起,我会照顾下一次。感谢您指出 – Ashish 2013-04-29 23:51:39

回答

5

像很多编程语言(Python和Java的,C,C++等),当你有一个函数调用,比如

foo(a, b, ...); 

所有表达式ab等进行评估,然后再自己结果作为参数传递给foo

$("div").click(function(){ 
    divClick(); 
}); 

表达的情况下,是function(){ divClick(); },这是一个函数表达式。评估它的结果是函数(对象)。因此函数被传递给.click

$("div").click(divClick()); 

的表达的情况下是divClick(),这是一个函数调用。这意味着功能divClick执行和它返回的任何内容将传递到.click


简化的例子:

function a(arg) { 
    alert(arg); 
} 

function b() { 
    return 42; 
} 

a(b()); // alerts 42 

b这里执行第一,它的返回值是42。该值作为参数传递给a,并在arg的函数中可访问。


如果有任何网址我会很乐意去学习它。

真的没有什么特别的。这就是函数调用的评估方式。也许你会被参数所传递的函数弄糊涂了。在JavaScript中,函数是一等公民,可以像任何其他值(数字,布尔值,字符串...)一样传递。

大约功能的阅读材料:

+0

你是绝对正确的,非常感谢你的详细解释。 – Ashish 2013-04-29 23:49:06

2

第二个立即调用divClick()并将其作为.click()回调处理程序传回。

使用这个代替:

$("div").click(divClick); 

这里我们传递一个参考到一个函数作为事件处理程序。

+0

非常感谢,您是否建议我提供任何好的图书或网址,以便我可以了解它。 – Ashish 2013-04-29 23:34:41

0

当注册事件,在这种情况下click,输入是给函数的引用应该在事件发生时被调用。在第一种情况下,你正在定义一个匿名函数。但是,在第二种情况下,divClick()不是引用,因此它评估并期望功能divClick返回引用。在评估过程中,您的方法实际上会被调用,因此也会被调用。

+0

@zerkms:谢谢,我纠正了它。 – devang 2013-04-29 23:44:52

0

补充费利克斯·克林的答案 可以以这种方式改变

$(document).ready(function(){ 
    $("div").click(divClick()); 
}); 

$(document).ready(function(){ 
    $("div").click(divClick); 
}); 

你逝去称为“divClick”,而不是divClick的”返回值的函数对象()“在这种情况下什么都不是。

其他肮脏的形式工作将改变功能这样的事情

function divClick(){ 
    return function(){ 
     alert("Hello World!!!"); 
    } 
} 
相关问题