【问题标题】:How is the element passed into the callback method in JavaScript?元素是如何传入 JavaScript 中的回调方法的?
【发布时间】:2026-02-15 01:10:01
【问题描述】:

我目前正在学习 JavaScript,我对 Array.find() 方法的回调函数如何工作感到有些困惑,

我有这个当前代码:

const numbers= [43,46,33,23,44,36,5]

function under50(num) {
    return num < 50;
}

val = numbers.find(under50);

根据 Mozilla 文档:

回调 对数组中的每个值执行的函数,采用三个参数:

元素

数组中正在处理的当前元素。

索引

当前正在处理的元素在数组中的索引。

数组

调用了数组查找。

现在了解我传递元素的方法,然后对其进行迭代,一旦找到元素,它将返回值。但是,让我感到困惑的是,当我从未明确地将方法传递给 Array 时,它是如何知道元素的?如果有人可以发布一个简单的示例,那将非常有帮助

【问题讨论】:

  • 你说的“我从来没有显式地传递数组的方法”是什么意思?它就在那里:numbers.find。这是Array.prototype.find,其中Array 是您的数组(numbers)。
  • 你正在调用find() on 数组,所以它知道数组是什么。您发布了一个工作示例——您还在寻找什么其他类型的示例?
  • 正是您向回调函数表明要继续执行的元素是什么,这里是您的 numbers 数组
  • 在数组上调用.find()有效结果如下for (let i = 0; i &lt; numbers.length; i++) { if (callback(numbers[i], i, numbers)) return numbers[i] } - 但是你不应该假设JS引擎只是用它替换它 - 它没有不一定。然而,不管它做什么,它都会达到同样的效果。

标签: javascript arrays methods callback


【解决方案1】:

为了扩展@GerardoFurtado 的评论,.find() 方法内的this 的值被设置为您的数组。所以它既有数组又有回调函数。然后它基本上创建了一个典型的for 循环,并在该循环中调用你的回调,传递每个成员。

举个简单的例子,创建你自己的.find()方法。

// Be careful extending native prototypes
Array.prototype.myFind = function(callback) {
  for (var i = 0; i < this.length; i++) {
    if (callback(this[i], i, this)) {
      return this[i]; // callback result was "truthy" so return this item
    }
  }

  return undefined; // not found, so return undefined
}

const numbers = [43,46,33,23,44,36,5]

function under50(num) {
    return num < 50;
}

const val = numbers.myFind(under50);

console.log(val);

这是相当简化的,并没有表现出与标准方法相同的行为,但足以说明如何使用 this 作为调用该方法的对象的引用。

为了完整起见,您可能会问 JavaScript 如何知道您的数组有一个名为 find 的属性(在本例中为方法)。显然,事实并非如此。但是 JavasCript 会在原型链中寻找find。看看:

const numbers= [43,46,33,23,44,36,5];
console.log("find" in numbers)

【讨论】:

  • 你也可以把它放在你的答案中,以表明该属性是在原型链中查看的:jsfiddle.net/8s0Ljbhh
  • @GerardoFurtado:我把它做成了一个社区维基,所以请随时改进。
  • 这是一个非常有帮助和鼓舞人心的答案,非常感谢!
最近更新 更多