您能解释一下参数是如何在回调函数中自动传递的吗?
1. const arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
2. arr.sort(comFunc);
3. /* how arugments 'a' and 'b' are passed inside comFunc in sort() function */
4. function comFunc(a, b){
5. return b - a;
6. }
7. arr.forEach((item)=>{
8. console.log(item);
9. })
在上面的代码中,我很困惑a和b是如何在sort((中自动作为参数传递的?你能解释一下代码中的第二行吗?comFunc是如何得到他的论点的?
Array.prototype.sort函数将遍历数组,将当前索引(a(和下一个索引(b(处的值传递给您提供的回调函数。
根据你上面的例子,它应该在每次迭代中进行以下调用
0: a = 1; b = 2
1: a = 2; b = 3
2: a = 3; b = 4
...
您的comFunc
是Function类型的变量。它稍后将由sort
方法在内部调用,并负责传递具有适当值的参数。
这里是一个更简单的例子,因为sort
有点复杂。让我们看看Array.filter
函数:
filter((方法创建一个新数组,其中包含通过所提供函数实现的测试的所有元素。
我们可以实现这样的功能:
function filter(arr, filterFunction) {
const result = [];
for (let item of arr) {
if (filterFunction(item)) {
result.push(item);
}
}
return result;
}
在创建函数时,您不知道";最终显影剂";要使用进行筛选。因此,您让开发人员传递一个函数,开发人员的工作是确保它是一个接受项并返回类似布尔值的结果的函数。我们的工作是传递项目并根据结果采取相应的行动。例如:
const arr = [1,10,5,3,2];
const filteredArr = filter(arr, require5OrMore);
function require5OrMore(item) {
return item >= 5;
}
// filterArr now contains only items that are >= 5 (10 and 5)
请注意,在现实中,上述代码可以使用匿名和/或箭头函数进行简化:
const filteredArr = filter(arr, item => item >= 5);
现在,如果您仍然无法理解为什么会发生这种情况,您可以在上面的filter
函数和require5OrMore
函数中放置一些断点,并在代码运行时检查值。