我正在研究回调概念,通常我会看到一个被用作"函数呼叫"的f参数之一:callback(arr [i]),但它还不是一个函数。我想我们预计其中一个参数是一个函数,所以这是一种可以接受的方法?
参考:
function processArray(arr, callback) {
var resultArr = new Array();
for (var i = arr.length - 1; i >= 0; i--)
resultArr[i] = callback(arr[i]);
return resultArr;
}
看。如果要处理数组的每个项目并获取包含字符串表示的length
的新数组,则可以执行
function processArray(arr, callback) {
if(typeof callback !== 'function') {
throw new Error('The callback is not a function');
}
const resultArr = new Array();
for (var i = arr.length - 1; i >= 0; i--) {
resultArr[i] = callback(arr[i]);
}
return resultArr;
}
const weekdays = ['Monday', 'Tuesday', 'Wednesday'];
console.log(processArray(weekdays, item => item.length));
如果您现在想提高所有这些并获得另一个数组怎么办?
function processArray(arr, callback) {
if(typeof callback !== 'function') {
throw new Error('The callback is not a function');
}
const resultArr = new Array();
for (var i = arr.length - 1; i >= 0; i--) {
resultArr[i] = callback(arr[i]);
}
return resultArr;
}
const weekdays = ['Monday', 'Tuesday', 'Wednesday'];
console.log(processArray(weekdays, item => item.toUpperCase()));
对于这两个操作,如果我们不通过回调函数,我们需要使用自己的操作创建2个单独的功能。通过传递参数,我们使函数 generic ,因此我们将单个函数逻辑如何处理每个项目,然后返回结果。
它将为每个项目调用功能,将项目作为参数传递到函数中,然后返回结果。然后,我们将结果放入新的映射数组中。
这是一种可接受的方法?
是的,这是一种可接受的方法。这是一种非常现代的方法。您有一个功能,每个项目都可以通过任何逻辑传递给它。在JavaScript中,使用此样式的函数中有许多构建(例如 Array#Map , Array#foreach )。还有很多库具有这种类型的功能。这不仅在Javacript中。
您可以通过首先检查函数来确保调用回调函数,例如:
function processArray(arr, callback) {
var resultArr = new Array();
for (var i = arr.length - 1; i >= 0; i--)
resultArr[i] = typeof callback === "function" && callback(arr[i]);
return resultArr;
}
如果callback
不是函数,则将resultArr[i]
设置为false
。
,如果您想将resultArr[i]
设置为null
(或其他值),则类似的东西也可以工作:
resultArr[i] = typeof callback === "function" ? callback(arr[i]) : null
callback
是一个具有函数的变量,您将其作为参数传递。当然,可以验证function
类型的参数。
function processArray(arr, callback) {
var resultArr = new Array();
for (var i = arr.length - 1; i >= 0; i--)
resultArr[i] = callback(arr[i]);
return resultArr;
}
var callback = function () { /* do something */ }
processArray([1, 2, 3], callback) // callback will hold a function you've assigned