有谁能告诉我为什么这不起作用?
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)
答案 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);