代码之家  ›  专栏  ›  技术社区  ›  alexia Greg Guida

为什么在javascript中有时需要函数()?

  •  3
  • alexia Greg Guida  · 技术社区  · 14 年前

    HTML

    <button id='hello'>Click Me!</button>
    

    javascript(错误)

    $('#hello').click(alert('Hello, World!'));
    

    javascript(正确)

    $('#hello').click(function() {
        alert('Hello, World!');
    }
    

    我想知道为什么第一个JS代码会触发事件 负载 而不是 点击 . 有人能告诉我为什么吗 function() { [code] } 脚本是否需要正常工作?

    在本例中,我使用了jquery事件,但这并不特定于它,例如,我需要将它与 设置超时 也是。

    9 回复  |  直到 14 年前
        1
  •  12
  •   Pablo Fernandez    14 年前

    这个 click 函数需要另一个函数作为参数。

    在第一种情况下,您将传递调用的结果 alert('hello world'); ,为空。

    第二个只是以下内容的简写:

    $('#hello').click(callback);
    
    function callback(){
      alert('hello world');
    }
    
        2
  •  2
  •   Cfreak    14 年前

    因为 .click() 是一个处理程序。第一个参数是要赋值的函数。但是如果你真的用参数传递函数,那么它将调用函数(在本例中 alert )然后传递它的返回值。

    写作 $('#hello ).click(function())`基本上是书写的简写:

    var myfunction = function() { 
      // code
    };
    
    $('#hello').click( myfunction );
    

    从长远来看,它是作为对函数的引用而不是函数的返回值传递的。

        3
  •  2
  •   Colin Fine    14 年前

    你的第一个例子说“评估

    alert(“你好,世界!”)

    现在,将结果作为参数传递给单击。“

    第二种说法是“定义一个函数,当我调用它时它会发出警报,并将整个函数作为参数传递给单击。

        4
  •  2
  •   We Are All Monica    14 年前

    这个 function() { ... } 语法就是如何在JavaScript中声明匿名函数。jquery使用许多这样的方法来指定稍后将执行某些操作,比如事件发生时。您可以将其视为将函数的执行延迟到必要时。如果没有这种语法,无论您放置在那里的代码是什么,都会立即进行计算,这不是您想要的事件处理程序。

    你可能会想,“为什么JavaScript不够聪明,不知道区别?”考虑一下:

    function returnCallback(linkId, data) {
        return function(e) {
            alert('Clicked on ' + linkId + '.  Here is some data: ' + data);
            // Maybe do some stuff with e, the event parameter
        }
    }
    
    $('#some-link').click(returnCallback('some-link', 'some-data'));
    
    $('#other-link').click(returnCallback('other-link', 'different-data'));
    

    这是一个人为的例子,但它说明了匿名函数和闭包的强大功能。这项工作始于 returnCallback 返回函数。

        5
  •  1
  •   Richard Marskell - Drackir Sunil Tandon    14 年前

    在第一个例子中,“javascript错误”,你实际上是在调用 alert('Hello, World!') 在加载脚本时。现在,你通过的原因 .click 函数是因为它可以在任何点调用它。本质上,您将代码打包在一起,以便在将其放入函数的任何时候运行(或者根本不运行)。

    $('#hello').click(alert('Hello, World!')); 正在尝试运行 alert('...') 并将其返回值传递给 .click() 无法按预期工作的函数。

        6
  •  1
  •   azamsharp    14 年前

    这是因为JavaScript会评估所有内容,在此过程中会调用警报。您可以使用匿名函数,也可以使用自己的自定义函数,具体实现如下:

    <script language="javascript" type="text/javascript">
    
        $("#mybutton").click(clickFired);
    
    
        function clickFired() {
    
            alert('click fired');
        }
    
    </script>
    
        7
  •  0
  •   alex    14 年前

    .click()函数所需的参数是一个函数。因此,$(hello”)。需要单击(函数[代码])。因为alert()没有可返回的内容。

        8
  •  0
  •   annakata    14 年前

    这里的click函数为事件处理程序赋值。

    对于第一个(“错误”)代码,您要分配的值为 alert('Hello, World!') 它本身就是一个函数调用,所以将立即对其进行计算,从而在加载时出现。

    使用第二个(“正确的”)代码,您现在将分配一个新的匿名函数,该函数本身不会执行, 刚刚实例化 加载时。因此,这将在以后如预期的那样工作。

        9
  •  0
  •   krishna    14 年前

    somefunction(alert('你好!世界”);

    这意味着您要将alert的返回值(“hello!”)传递给somefunction。世界”)。

    jquery click需要在单击元素时触发一个回调。所以您将它放入一个函数中,除非有人(这里是jquery)显式调用它,否则它不会执行。