我正在努力学习回调,在我阅读了雄辩的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])();
我不确定我理解回调的方式是否正确,但我的重写工作并显示相同的结果...有人可以向我解释第一个回拨格式是如何工作的吗?
答案 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);