当前位置: 首页 > 知识库问答 >
问题:

为什么不能在nodeList上调用forEach?

琴元凯
2023-03-14

我正在使用forEach循环一个nodeList。我的代码如下

var array = document.querySelectorAll('items');

array.forEach(function (item) {
    console.log(item);
}); 

此代码引发错误为

未捕获的TypeError:Array.Foreach不是函数

[].forEach.call(array, (function (item) {
    console.log(item);
})); 

然而,一些较旧的浏览器还没有实现nodelist.foreach()和array.from()。但是这些限制可以通过使用array.prototype.foreach()来规避(本文档中有更多内容)。

参考:MDN

共有1个答案

盛嘉
2023-03-14

这是JavaScript中的一个基本内容:您可以从一个对象中获取函数并应用于任何其他对象。也就是说:用this设置为应用函数的对象来调用它。这是可能的,因为在JavaScript中,所有的属性名等都是由名称标识的。因此,尽管nodelist.lengtharray.length不同,但函数array.foreach可以应用于任何公开length属性的东西(以及foreach需要的其他东西)。

所以在你的情况下发生的是:

  • QuerySelectorAll()返回一个NodeList类型的对象,该对象碰巧公开Length属性,并且是可枚举的(假设它可以由[]操作符访问);NodeList不公开foreach函数(您可以在这里看到:https://developer.mozilla.org/en-美国/docs/web/api/NodeList)-这就是为什么不能直接对queryselectorall()
  • 的结果调用 foreach
  • [].foreach返回一个函数-对于array.prototype.foreach
  • 来说,这是一个不太聪明的快捷方式
  • 使用[].foreach.call(array,…)将此函数应用到array引用的对象上,使用array调用NodeList类型的对象(即foreach调用函数体中的this,因此当在foreach中有this.length时,它引用array中的length而不
  • 这是有效的,因为foreach使用了Array和NodeList的共同属性;如果foreach想使用Array具有的某些属性,但NodeList没有
  • 则会失败
 类似资料:
  • 问题内容: 假设我有这个SQL查询: 如果我尝试执行此操作,则会收到一条错误消息,提示“ ISNULL附近的语法不正确”。我知道这是ISNULL的正确语法。为什么不能在CONTAINS语句内部调用ISNULL? 问题答案: 试试这个: 当您尝试将表达式放入存储过程调用时,这是相同的问题: CONTAIN需要字符串文字,请参见CONTAINS(Transact-SQL)

  • 我对学习java中的方法还不熟悉。在python中,使用“函数”很容易,但我最近了解到java没有类似的功能。我有一个方法,应该返回n1和n2中的最低值。我在公共静态int函数的行中得到一个错误。。。 但语法似乎没有任何问题。

  • 问题内容: 我有一个expressjs应用程序,在特定的路由上,我调用了一个函数,该函数通过使用数据库文档作为参数来响应数据库中的用户。我使用基于promise的库,并且想在将数据库文档放入响应中的回调内联。但是当我这样做时程序会失败。有人可以解释为什么吗?我还想知道为什么内联调用才能真正起作用。两种方法和之间有一些根本区别吗? 这是一个有效和无效的示例。假定返回用户文档的承诺。 问题答案: 像这

  • 问题内容: 我不是从情节提要中使用a ,而是要有一个自定义函数,可以在其中传递某些对象的。我只想像在Objective- C中一样打电话。像这样: 但是我收到以下编译器错误: 必须调用超类UIViewController的指定初始化程序 我可以不再这样做吗? 问题答案: 对于指定的初始化器是。您应该打电话给它。 参见http://www.bignerdranch.com/blog/real-iph

  • 我使用Python 3.7、JRE 8、JDK 1.8在Eclipse(Eclipse plugins:PyDev)上安装了带有Hadoop2.6的Pysark2.1。 在scala.collection.maplike$class.default(maplike.scala:228) 在scala.collection.abstractmap.default(map.scala:59) 在sca

  • 问题内容: 我正在尝试使用方法两次读取给定文件的内容。奇怪的是,当我第二次调用它时,似乎没有将文件内容作为字符串返回? 这是代码 当然我知道这不是最有效或最好的方法,这不是重点。关键是,为什么我不能调用两次?我需要重置文件句柄吗?或者关闭/重新打开文件以执行此操作? 问题答案: 调用read()将读取整个文件,并将读取的游标留在文件的末尾(仅读取其他内容)。如果你希望一次阅读一定数量的行,则可以使