You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript高阶函数、回调与闭包求助:代码参数传递解析

JavaScript高阶函数、回调与闭包疑问解答

问题代码

function eitherCallback(callback1, callback2) {
    return num => callback1(num) || callback2(num)
}

function filterArray(array, callback) {
  const newArray = [];
  for (let i = 0; i < array.length; i += 1) {
    if (callback(array[i], i, array)) newArray.push(array[i]);
  }
  return newArray;
}
const arrOfNums = [10, 35, 105, 9];
const integerSquareRoot = n => Math.sqrt(n) % 1 === 0;
const over100 = n => n > 100;
const intSqRtOrOver100 = eitherCallback(integerSquareRoot, over100);
console.log(filterArray(arrOfNums, intSqRtOrOver100)); // should log: [105, 9]

疑问解答

1. intSqRtOrOver100作为filterArray的回调时,明明只接收num参数,为什么能处理filterArray传的3个参数?

JavaScript允许函数调用时传递的参数数量和声明的参数数量不一致。filterArray调用回调时确实传了数组元素、索引、原数组三个参数,但intSqRtOrOver100是eitherCallback返回的仅声明num参数的箭头函数——它只会取第一个参数赋值给num,剩下的参数会被直接忽略,不会影响函数执行逻辑。比如你定义function fn(a) {return a},调用fn(1,2,3)结果还是1,多余参数不会引发错误,只是没被用到。

2. eitherCallback传入的integerSquareRoot和over100,怎么拿到数组元素当参数?

intSqRtOrOver100是eitherCallback返回的箭头函数,当它被filterArray调用时,会先拿到第一个参数num(也就是当前遍历的数组元素),接着这个箭头函数会把num分别传给callback1和callback2——也就是你传入的integerSquareRoot和over100。相当于这个返回函数做了一次参数中转,把数组元素传递给了那两个目标函数。

3. 返回函数的num参数来自哪里?为什么访问不到filterArray里的newArray、i?

  • num的来源:就是filterArray调用这个返回函数时传入的第一个参数,也就是当前循环的数组元素array[i]。
  • 闭包的作用范围:闭包只会捕获函数定义时所在作用域的变量,和函数调用时的作用域无关。eitherCallback返回的箭头函数是在eitherCallback的作用域里定义的,所以它能访问到eitherCallback内部的callback1和callback2(这就是闭包的体现);而filterArray里的newArray、i属于filterArray的作用域,和返回函数的定义环境完全无关,所以无法访问。

内容的提问来源于stack exchange,提问作者unboundcoding

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 09:46:04