2015-09-29 29 views
2

我努力学习的回调,我读雄辩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])(); 

林不知道如果我理解回拨的方式是正确的,但我改写的作品和表演相同的结果...任何人都可以向我解释第一个回调格式的工作原理?

回答

3

在第二代码,所述函数合并返回打印的阵列的功能。

所以,merge([1, 2, 3, 4], [5, 6, 7, 8])();调用函数合并和执行返回的功能就行了。

我不认为它是一个回调。

在第一个代码,功能合并接收一个函数作为其第三个参数并执行该功能将数组传递给它(行callback(result)

这是我用回调明白:谁调用函数合并可以自由地将任何函数传递给它,因此可以自由地对由函数merge计算的数组执行任何代码。

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

merge([1, 2, 3, 4], [5, 6, 7, 8], function(merged) { alert(merged[0]) }); 

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

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

1

想到它是一个“回调”可能是混乱的一部分。在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);