向我解释回调以及它如何在代码中引用数组

Explain me callback and how its refer to array in code

我不明白这个例子中的回调是什么,特别是行 newArray.push(回调(这个[i])); 正如我得到的那样 (this[i]) 是数组中的项目,但是 CALLBACK 是如何引用代码的;

const s = [23, 65, 98, 5];

Array.prototype.myMap = function(callback) {
  const newArray = [];
  
  for(let i=0;i<this.length;i++){
      newArray.push(callback(this[i]));
  }
  return newArray;
};



const new_s = s.myMap(function(item) {
  return item * 2;
});

console.log(new_s);

1.背景概念

首先,上面的部分只是一个函数定义,其中 'callback' 只是 myMap 能够接受的参数。 'callback' 这个词并不特殊,实际上您可以使用任何名称,但是 'callback' 确实表示在您的函数定义中您要求调用者提供函数而不是整数或字符串。也就是说,你也可以这样写:

Array.prototype.myMap = function(param) {
   // you can console.log(param) and you would see the parameter in log.
}

理论上,您可以通过以下方式调用此函数:

s.myMap(1) // the log will show 1
s.myMap("hello") // the log will show "hello"
s.myMap(function() {}) // the log will show [Parameter is a Function]

其次,如果您将参数命名为 'callback',它会向调用者发出信号,表明他们实际上可以将一个函数传递给此 myMap,而不仅仅是一个整数或一个字符串——因此当您编写类似这样的内容时:

Array.prototype.myMap = function(callback_f) {
   callback_f(); // <----- call the incoming function passed as a param
}

然后调用者有一个想法,他们必须以这种方式向 myMap 提供一个函数:

s.MyMap(function() {
   // do some stuff
})

或者这样:

function doStuff() {}
s.MyMap(doStuff)

无论哪种方式,参数callback_f在这种情况下应该是一个函数,myMap将调用并执行这个函数,不管你传入什么它。

2。回答您的问题

您可能已经知道,这是一个特殊的函数定义,因为通过执行 Array.prototype.myMap 您正在修改所有数组的工作方式,并且所有数组现在都将获得此函数定义 myMap。

其次,如果 s 是任何数组,您可以通过执行 s.myMap() 调用 此函数。

所以在你的情况下,行:

newArray.push(callback(this[i]))

也可以写成:

let result_of_executing_the_callback = callback(this[i])
newArray.push(result_of_executing_the_callback)

意思是:首先,在索引i处的this(=当前数组)上执行传入的回调函数。而传入的回调函数是什么?这是你在 s.MyMap(f):

时传入的函数 f

在你的情况下 f 是这样的:

function(item) {
  return item * 2;
}

picture of f being passed into your function as the parameter 'callback'

(如果有帮助,请标记为已接受!)