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) 对函数定义求值并不会执行函数体,它只是将其保存以供以后调用。这就是函数的全部要点。在你调用它们之前,它们是不会被执行的。我想你需要阅读一本好的编程教科书,学习定义函数和调用函数之间的区别。我想我在回答中尽可能清楚地解释了这一点。如果你不懂基本原理,我就不去了