我有以下问题:
我为每个人
编写一个接受数组和回调函数的函数myForEach。 myForEach的行为应该尽可能地镜像本机.forEach()数组方法的功能。
以下是代码:
let sum = 0;
function addToSum(num) {
sum += num;
}
let nums = [10, 20, 30];
function myForEach(anArray, callback){
for (let i=0; i<anArray.length; i++){
let num = anArray[i];
//console.log(num)
// I don't understand what this line of code is doing...
callback(num, i, anArray);
}
return undefined
}
myForEach(nums, addToSum);
console.log(sum); // 6
上面的代码适用于这个更高阶函数问题,但我不明白为什么。具体来说,以下代码行是什么意思:
callback(num, i, anArray);
为什么有3个参数?这些参数传递给哪里?
“尽可能接近”是一项非常苛刻的要求。 Javascript内置函数非常复杂!这些是标准要求您实施的步骤:
http://www.ecma-international.org/ecma-262/7.0/#sec-array.prototype.foreach
用外行人的话来说,由于JS是一种高度动态的语言,当你设计一个内置函数时,你不能仅仅依赖于你期望它们的参数。在forEach
的情况下:
length
或它的length
可能不是一个数字等等。这就是为什么“尽可能接近”的实现应该在实际开始循环和调用之前进行大量的安全检查。
您可以在MDN页面上找到真实世界forEach
polyfill的示例(仅在您决定放弃此情况时查看):
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach
阅读here。 Javascript并不关心您传递了多少参数。例如,以下代码仍然有效但在undefined
函数中警告addToSum
:
let sum = 0;
function addToSum(num, i, k, j) {
sum += num;
console.log("i is:" + i);
console.log("k is:" + k);
console.log("j is:" + j);
}
let nums = [10, 20, 30];
function myForEach(anArray, callback) {
for (let i = 0; i < anArray.length; i++) {
let num = anArray[i];
//console.log(num)
// I don't understand what this line of code is doing...
callback(num);
}
return undefined
}
myForEach(nums, addToSum);
console.log(sum);
所以在原始代码中发生的事情是你传递的i
和anArray
根本不影响addToSum
函数,而且这个函数需要的唯一参数是num
所以一切都很好。
这是一个回调函数:
callback();
这是你传递给myForEach
的函数 - 在你的代码中,它是addToSum
,但它是一个不同名称的引用。如果你有不同的功能来处理不同的东西,它用于它。在您的代码中,您可以轻松使用addToSum
并完全忘记callback
:
let sum = 0;
function addToSum(num) {
sum += num;
}
let nums = [10, 20, 30];
function myForEach(anArray) {
for (let i = 0; i < anArray.length; i++) {
let num = anArray[i];
//console.log(num)
// I don't understand what this line of code is doing...
addToSum(num, i, anArray);
}
return undefined
}
myForEach(nums, addToSum);
console.log(sum);