学习回调函数:尝试理解不同形式的回调
Learning CallBack Function: Trying to understand different forms of callback
我正在尝试学习回调,在我阅读雄辩的JS之后,它引入了回调作为这种格式,我不熟悉,它没有解释它是如何工作的:
var merge = function(array1, array2, callback){
var result = [];
for (var i = 0; i < array1.length; i++) {
result[i] = array1[i] + array2[i];
};
callback(result)
};
merge([1, 2, 3, 4], [5, 6, 7, 8], function(merged) {console.log(merged)});
但是在我从代码学校学习之后,我试着把格式重写成这样:
var merge = function(array1, array2, callback){
var result = [];
for (var i = 0; i < array1.length; i++) {
result[i] = array1[i] + array2[i];
};
return function() {console.log(result)}
};
merge([1, 2, 3, 4], [5, 6, 7, 8])();
我不确定我理解回调的方式是否正确,但我的重写工作并显示相同的结果…谁能给我解释一下第一次回电是怎么回事?
在第二段代码中,函数merge返回一个打印数组的函数。
因此,merge([1, 2, 3, 4], [5, 6, 7, 8])();
行调用函数merge并执行返回的函数
我不认为这是一个回调。
在第一个代码中,函数merge接收一个函数作为它的第三个参数,并执行这个函数,传递给它一个数组(行callback(result)
)
这是我对回调函数的理解:调用merge函数的人可以自由地传递任何函数给它,因此,可以自由地在merge函数计算的数组上执行任何代码。
例如,考虑函数merge的第一个定义,可以这样做
merge([1, 2, 3, 4], [5, 6, 7, 8], function(merged) { alert(merged[0]) });
在警告窗口中显示结果数组的第一个元素。
同样,第一个结构是异步的,而第二个不是。
认为它是一个"回调"可能是令人困惑的部分。在javascript中,函数不需要严格地成为函数。它们可以是变量或参数,正如您在示例中看到的那样。
这些都将产生相同的结果:
// as a variable
var myVariableFn = function() {
console.log('executed function');
};
myVariableFn();
// as a named function
function myFn() {
console.log('executed function');
}
myFn();
// as an anonymous function
(function() {
console.log('executed function');
})();
// as a reference to another function
var myRefToFn = myFn;
myRefToFn();
// as a reference to the variable function
var myRefToVariableFn = myVariableFn;
myRefToVariableFn();
在你的第一个例子中,它工作是因为你传递了一个匿名函数作为最后一个参数,因此它被分配给callback
。既然您已经为callback
指定了一个函数,那么您可以像执行任何其他函数一样,通过输入callback()
来执行它。
它实际上归结为一个简单的事实,即你在传递函数,这比试图定义什么是"回调"更容易理解。
因为你只是把这些传递给另一个函数,你可以用同样的方式使用它们作为一个"回调",像这样:
function useCallback(callbackParam) {
callbackParam();
};
useCallback(myVariableFn);
useCallback(myFn);
useCallback(function() {
console.log('executed function');
});
useCallback(myRefToFn);
useCallback(myRefToVariableFn);
- JavaScript回调函数
- 如何在回调函数中执行流
- 回调函数中传递参数的困难(Google Map API Markers)
- 如何正确地将参数传递给RequireJS回调函数
- 回调函数在python代码中离线
- 从AJAX回调函数中分离数据
- 赋值后的回调函数
- 如何在javascript回调函数中返回多个变量
- 函数表达式,返回回调函数
- 等待回调函数执行
- JavaScript回调函数和Google Feed API
- 如何从ajax成功回调函数中读取javascript变量
- 正在保存JavaScript内部回调函数中的值
- 有没有什么方法可以停止Jquery中的animate(也可以停止完整的回调函数)
- 如何在javascript中添加带有回调函数的按钮点击事件作为window.conf
- 在Golang回调函数中启用CORS
- 在初始函数完成之前调用回调函数
- jQuery Mobile:如何在$.Mobile.changePage之前运行回调函数
- 即使使用回调函数也无法返回值
- 为什么prototypjs观察到回调函数有绑定