0

我正在学习 JavaScript 并试图理解它。这对你来说可能很简单,但我确实需要解释。所以这是我的java脚本文件代码。

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

所以如果我这样称呼它

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

一切正常,只有当我点击 div 元素时才会出现警告框。但如果我像这样访问它

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

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

4

4 回答 4

5

就像在许多编程语言(Python、Java、C、C++ 等)中一样,当你有一个函数调用时

foo(a, b, ...);

首先计算所有表达式a,b等,然后将它们的结果foo作为参数传递给。

的情况下

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

表达式 is 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 中,函数是一等公民,可以像任何其他值(数字、布尔值、字符串...)一样传递。

关于函数的阅读材料:

于 2013-04-29T23:35:22.340 回答
2

第二个立即调用divClick()并传递它作为.click()回调处理程序返回的内容。

改用这个:

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

在这里,我们将一个函数的引用作为事件处理程序传递。

于 2013-04-29T23:31:57.533 回答
0

补充Felix Kling的答案,您可以更改

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

为了

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

这样,您将传递一个名为“divClick”的函数对象,而不是“divClick()”的返回值,在这种情况下什么都不是。

其他肮脏的工作形式是改变这样的功能

function divClick(){
   return function(){ 
      alert("Hello World!!!");
   }
}
于 2013-04-29T23:54:34.407 回答
0

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

于 2013-04-29T23:39:44.417 回答