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

javascript—寻求令人满意的解释,解释回调中为什么需要匿名函数包装器,javascript,callback,Javascript,Callback,我知道这是可行的: $("#btn_1").click(function() { alert("Btn 1 Clicked"); }); 虽然这只是过早地弹出警报对话框: $("#btn_1").click(alert("Btn 1 Clicked");); 我的问题是:在第二种情况下,为什么警报在执行之前不等待单击?因为调用函数时,参数会立即执行,以提供传递给函数的参数 func(arg); 相当于: var temp = arg; func(temp); var temp = a

我知道这是可行的:

$("#btn_1").click(function() {
  alert("Btn 1 Clicked");
});
虽然这只是过早地弹出警报对话框:

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

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

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

func(arg);
相当于:

var temp = arg;
func(temp);
var temp = alert("Btn 1 Clicked");
$("#btn_1").click(temp);
所以当你写作时:

$("#btn_1").click(alert("Btn 1 Clicked"));
这相当于:

var temp = arg;
func(temp);
var temp = alert("Btn 1 Clicked");
$("#btn_1").click(temp);
显然,在此表单中,警报发生在调用
之前。单击()
为事件添加侦听器

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

它不必是匿名函数,也可以命名它

function myAlert() {
    alert("Btn 1 Clicked");
}
$("#btn_1").click(myAlert);
但是请注意,您只需将函数名作为参数提供给
。单击()
,您不会编写
myAlert()
,因为这样会立即调用它,而不会延迟到单击事件发生

正如@Titus所说,
click()
希望它的参数是一个函数,因为它希望以回调的形式执行它。但您可以调用另一个函数来返回函数:

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

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

因为调用函数时,参数会立即执行,以提供要传递给函数的参数

func(arg);
相当于:

var temp = arg;
func(temp);
var temp = alert("Btn 1 Clicked");
$("#btn_1").click(temp);
所以当你写作时:

$("#btn_1").click(alert("Btn 1 Clicked"));
这相当于:

var temp = arg;
func(temp);
var temp = alert("Btn 1 Clicked");
$("#btn_1").click(temp);
显然,在此表单中,警报发生在调用
之前。单击()
为事件添加侦听器

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

它不必是匿名函数,也可以命名它

function myAlert() {
    alert("Btn 1 Clicked");
}
$("#btn_1").click(myAlert);
但是请注意,您只需将函数名作为参数提供给
。单击()
,您不会编写
myAlert()
,因为这样会立即调用它,而不会延迟到单击事件发生

正如@Titus所说,
click()
希望它的参数是一个函数,因为它希望以回调的形式执行它。但您可以调用另一个函数来返回函数:

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

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

以下是我能想到的最好的解释:

var alertResult = alert('Btn 1 clicked');
button.addEventListener('click', alertResult); // say waaat?
var alertFunction = function() {
    alert('Btn 1 clicked');
};
button.addEventListener('click', alertFunction); // Yess!

以下是我能想到的最好的解释:

var alertResult = alert('Btn 1 clicked');
button.addEventListener('click', alertResult); // say waaat?
var alertFunction = function() {
    alert('Btn 1 clicked');
};
button.addEventListener('click', alertFunction); // Yess!
click(…)
函数需要一个函数作为参数,而不是传递函数,而是传递函数的结果

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

单击(…)
函数需要一个函数作为参数,您不是传递函数,而是传递函数的结果

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

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

您正在调用该函数

func(arg);
您可以使用
.bind()

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

您正在调用该函数

func(arg);
您可以使用
.bind()


考虑<代码>警报(Apple函数())<代码> -哪个函数运行第一,<代码>警报()/<代码>或<代码>函数()/<代码>?现在考虑<代码>警报(AfFunc(AONTRORM函数))<代码>……记住中学的代码> PMEDAS < /代码>?<代码> P<代码>也适用于这里。请考虑<代码>警报(Apple Stor())<代码> -哪个函数运行第一,<代码>警报()/代码>或<代码>函数()/<代码>?现在考虑<代码>警报(AfFunc(AONTRORM函数))<代码>……记住中学的代码> PMEDAS < /代码>?
P
在这里也适用。@user1883050-如果函数调用的结果是对函数的引用,那么这很好。我添加了一个返回另一个函数的函数示例。(1)这不是函数定义。(2) 对函数定义求值并不会执行函数体,它只是将其保存以供以后调用。这就是函数的全部要点。在你调用它们之前,它们是不会被执行的。我想你需要阅读一本好的编程教科书,学习定义函数和调用函数之间的区别。我想我在回答中尽可能清楚地解释了这一点。如果您不了解基本知识,我将无法帮助您。@user1883050-如果函数调用的结果是对函数的引用,那么这很好。我添加了一个返回另一个函数的函数示例。(1)这不是函数定义。(2) 对函数定义求值并不会执行函数体,它只是将其保存以供以后调用。这就是函数的全部要点。在你调用它们之前,它们是不会被执行的。我想你需要阅读一本好的编程教科书,学习定义函数和调用函数之间的区别。我想我在回答中尽可能清楚地解释了这一点。如果你不懂基本原理,我就不去了