为什么JavaScript中有时需要function()?

时间:2010-11-10 15:21:45

标签: javascript javascript-events anonymous-function jquery

HTML

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

JavaScript(错误)

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

JavaScript(正确)

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

我想知道为什么第一个JS代码会在事件加载而不是点击上触发。谁能告诉我为什么脚本正常工作需要function() { [code] }

在这个例子中,我使用了jQuery事件,但这并不是特定的,例如,我需要将它与 setTimeout 一起使用。

9 个答案:

答案 0 :(得分:12)

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

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

第二个只是简写:

$('#hello').click(callback);

function callback(){
  alert('hello world');
}

答案 1 :(得分:2)

因为.click()是处理程序。第一个参数是要分配的函数。但是如果你实际上通过参数传递函数,那么它将调用函数(在这种情况下为alert),然后传递它的返回值。

$('#hello)。click(function(){})`基本上是写作的简写:

var myfunction = function() { 
  // code
};

$('#hello').click( myfunction );

正如您可以看到的那样,它是作为函数的引用而不是函数的返回值传递的。

答案 2 :(得分:2)

你的第一个例子说“评估

警告('你好,世界!')

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

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

答案 3 :(得分:2)

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返回一个函数。

答案 4 :(得分:1)

在第一个实例中,“JavaScript wrong”,您实际上是在加载脚本时调用alert('Hello, World!')。现在,您将.click函数传递给函数的原因是因为它可以在任何时候调用它。从本质上讲,当您将代码放入函数中时,您可以随时将代码打包(或根本不运行)。

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

答案 5 :(得分:1)

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

<script language="javascript" type="text/javascript">

    $("#mybutton").click(clickFired);


    function clickFired() {

        alert('click fired');
    }

</script>

答案 6 :(得分:0)

.click()函数所需的参数是一个Function。因此$(“#hello”)。click(function {[code]});是必须的。因为alert()无法返回任何内容。

答案 7 :(得分:0)

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

对于第一个(“错误的”)代码,您指定的值alert('Hello, World!')本身就是一个函数调用,因此它会立即进行评估,因此会出现在加载状态。

使用第二个(“正确”)代码,您现在正在分配一个新的匿名函数,该函数不会自行执行,只是在加载时实例化。因此,这将在以后的预期中发挥作用。

答案 8 :(得分:0)

somefunction(alert('hello!world'));

这意味着你想传递一些函数alert的返回值(“hello!world”)。

jquery click需要一个回调,它应该在单击元素时触发。所以你把它放在一个不执行的函数中,除非有人(这里是jquery)明确地调用它。

相关问题