javascript - 寻求令人满意的解释为什么匿名函数包装器在回调中需要

时间:2016-08-18 03:08:09

标签: javascript callback

我知道这有效:

$("#btn_1").click(function() {
  alert("Btn 1 Clicked");
});

虽然这只会过早地弹出警告对话框:

$("#btn_1").click(alert("Btn 1 Clicked"););

我的问题是:在第二种情况下,为什么警报在执行之前不会等待 点击

4 个答案:

答案 0 :(得分:2)

因为当你调用一个函数时,会立即执行参数以提供传递给函数的参数。

func(arg);

相当于:

var temp = arg;
func(temp);

所以当你写:

$("#btn_1").click(alert("Btn 1 Clicked"));

它相当于:

var temp = alert("Btn 1 Clicked");
$("#btn_1").click(temp);

很明显,在这种形式中,警告发生在调用.click()之前为事件添加侦听器。

为了延迟动作,你必须提供一个函数作为参数。函数定义本身并不会导致任何代码被执行,它只会在以后调用时执行(这称为"回调")。

它不必是匿名函数,您也可以将其命名。

function myAlert() {
    alert("Btn 1 Clicked");
}
$("#btn_1").click(myAlert);

但请注意,您只是提供函数的名称作为.click()的参数,您不要写myAlert(),因为这会立即调用它,而不会延迟到点击事件发生。

正如@Titus所说,click()期望它的参数是一个函数,因为它想要将它作为回调来执行。但是你可以调用另一个函数来返回一个函数:

function alerter(message) {
    return function() {
        alert(message);
    }
}
$("#btn_1").click(alerter("Btn 1 Clicked"));

请注意,alerter()没有直接调用alert(),它会返回另一个函数,该函数在调用时会调用alert()。如上所述,在click事件执行其回调之前不会发生这种情况。

答案 1 :(得分:2)

这是我能想到的最佳解释:

issues

答案 2 :(得分:1)

addAction(okAction)函数需要一个函数作为参数,你不会将它作为函数传递,你将它传递给函数的结果。

考虑一下:click(...) func(1+2)方法的参数将是func(结果)而不是3(操作本身)。

答案 3 :(得分:1)

  

我的问题是:在第二种情况下,为什么警报不等待点击   在执行之前?

您正在调用该函数。

您可以使用event

引用.bind()发生时要调用的函数
$("#btn_1").click(alert.bind(window, "Btn 1 clicked"));