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
相关产品推荐
相关产品推荐

