【问题标题】:Why is console.log illegaly invocated as a function parameter? [duplicate]为什么 console.log 被非法调用为函数参数? [复制]
【发布时间】:2013-05-17 18:35:44
【问题描述】:

当我尝试时

[1,2,3].forEach(alert);

它会按预期为数组的每个项目打开消息框。

但是当我尝试时

[1,2,3].forEach(console.log);

我收到以下错误

Uncaught TypeError: Illegal invocation

为什么?

【问题讨论】:

  • 这个问题是谷歌浏览器特有的吗?
  • [1,2,3].forEach(console.log) 在 Firefox 中运行良好。
  • @MathieuImbert 我知道在 IE 中 console.log 本身会返回错误,除非打开调试控制台。我怀疑这不是一个普通的功能,但我不确定。也许每个浏览器都以不同的方式实现它?
  • 不管怎样,您总是可以通过console.log(1, 2, 3); 看到三个独立的元素。不过,这可能不适合您的用例。

标签: javascript google-chrome


【解决方案1】:

我个人得到Invalid calling object

请看,[1,2,3].forEach(console.log) 本质上是迭代数组和运行console.log.call(theArray,theItem) 的每个项目的简写方式。但是,console.log 要求 thisConsole 类型的对象,因此会出现错误。

试试[1,2,3].forEach(function(i) {console.log(i);})

【讨论】:

  • 太棒了!正如您所解释的那样,我设法通过将控制台传递到其上下文中来解决它并且它有效:[1,2,3].forEach(console.log.bind(console));您能否将其添加到您的答案中以帮助其他人遇到这个问题?
【解决方案2】:

实际上,它在 Firefox 中不起作用,或者至少不像你想象的那样:

[1,2,3].forEach(console.log)

给你:

1 0 [1, 2, 3]
2 1 [1, 2, 3]
3 2 [1, 2, 3]

为什么? MDN有你的答案:

使用三个参数调用回调:

  • 元素值

  • 元素索引

  • 被遍历的数组

然而,

[1,2,3].forEach(function(i) { console.log(i); });

在 Firefox 和 Chrome 中完全符合您的预期。

【讨论】:

  • 我知道 - 创建匿名函数只是为了调用本机函数很奇怪。无论如何,感谢您提供有用的解释。
  • @JanTuroň:问题在于 JavaScript 是动态类型的,所以你可以调用带有任意数量(或根本没有)任何类型的参数的函数,它会try i> 做某事。有时它会给你一个错误,有时它会做一些意想不到的事情。
猜你喜欢
  • 2016-12-05
  • 1970-01-01
  • 2015-04-28
  • 2012-11-16
  • 2014-07-21
  • 2018-06-14
  • 2020-06-29
  • 1970-01-01
  • 2022-07-05
相关资源
最近更新 更多