Array.prototype.forEach.call给出了TypeError:非法调用

时间:2016-02-15 18:25:08

标签: javascript arrays foreach call uncaught-typeerror

有谁能告诉我为什么这不起作用?

Array.prototype.forEach.call(document.body.children, console.log);

我收到以下错误:

  

未捕获的TypeError:非法调用(...)(匿名函数)

这似乎是无稽之谈,因为以下两者都有效:

Array.prototype.forEach.call(document.body.children, function () {console.log(arguments)});
Array.prototype.forEach.call(document.body.children, l=>console.log(l));
  

注意:被调用的函数(在这种情况下为console.log)只是一个示例,最初的意图是使用document.body.removeChild代替,但这失败的方式相同。

     

另一个注意:我只在Chrome中试过这个。我在 node.js 控制台中尝试了以下操作,它运行良好:

Array.prototype.forEach.call(myArray, console.log)

1 个答案:

答案 0 :(得分:4)

那是因为必须在console.log对象上调用console方法:

var log = console.log;
log(123); /* TypeError: 'log' called on an object that
             does not implement interface Console. */
log.call(console, 123); /* Works */

您可以通过将第三个参数传递给forEach来确定this值:

Array.prototype.forEach.call(document.body.children, console.log, console);

或者您可以将console.log绑定到console

Array.prototype.forEach.call(document.body.children, console.log.bind(console));

还提出了bind operator

的提案
Array.prototype.forEach.call(document.body.children, ::console.log);