学习回调函数:尝试理解不同形式的回调

时间:2015-09-29 16:02:55

标签: javascript 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])();

我不确定我理解回调的方式是否正确,但我的重写工作并显示相同的结果...有人可以向我解释第一个回拨格式是如何工作的吗?

2 个答案:

答案 0 :(得分:3)

在第二个代码中,函数merge返回一个打印数组的函数。

因此,行callback(result)调用函数merge并执行返回的函数。

我不认为它是回调。

在第一个代码中,函数merge接收一个函数作为其第三个参数,并执行此函数将数组传递给它(行merge([1, 2, 3, 4], [5, 6, 7, 8], function(merged) { alert(merged[0]) });

这是我通过回调理解的:调用函数merge的人可以自由地将任何函数传递给它,因此可以自由地执行函数merge计算的任何代码。

例如,考虑到函数合并的第一个定义,可以做

core
----app
--------app.module.js
--------app.config.js

----util
--------util.module.js

components
----comp1
--------comp1.module.js
--------comp1.etc
----comp2
--------comp2.module.js

在警报窗口中显示结果数组的第一个元素。

此外,第一个构造是异步的,而第二个构造不是。

答案 1 :(得分:1)

将其视为&#34;回调&#34;可能是令人困惑的部分。在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()来执行该功能。

这真的归结为一个简单的事实,即你传递函数,这比试图定义一个&#34;回调&#34;更容易理解。是

由于您只是将这些功能传递给其他功能,因此您可以像使用&#34;回调&#34;一样使用它们,如下所示:

function useCallback(callbackParam) {
  callbackParam();
};

useCallback(myVariableFn);
useCallback(myFn);
useCallback(function() {
  console.log('executed function');
});
useCallback(myRefToFn);
useCallback(myRefToVariableFn);