我正在研究回调概念,我常常看到其中一个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;
}
答案 0 :(得分:2)
看。如果要处理数组的每个项并获取包含aws
字符串表示的新数组,则可以执行
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));

对于这两项操作,如果我们不传递回调函数,我们需要使用自己的操作创建2个单独的函数。通过传递参数,我们将函数泛型,因此我们为单个函数提供逻辑如何处理每个项目并返回结果。
它将为每个项调用该函数,将该项作为参数传递给函数并返回结果。然后我们将结果放入新的映射数组中。
这是一种可接受的方法呢?
是的,这是一种可接受的方法。这是一种非常现代的方法。你有一个功能,每个项目都会传递给你的任何逻辑。在Javascript中,有许多使用此样式的函数构建(例如Array#map,Array#forEach)。此外,很多库都有这样的类型函数。这不仅仅是在Javacript。
答案 1 :(得分:1)
你可以通过先检查它是一个函数来确保调用回调函数,如下所示:
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
答案 2 :(得分:1)
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