console.log 的执行上下文

Execution context of console.log

我在玩console.log。我知道 log 必须在 console 的上下文中执行。我们可以做 console.log('message')console.log.call(console, 'message')

我这里有两个代码片段:

[1, 2, 3].forEach(console.log);   // doesn't work!!!

行之有效的是:

var http = require('http');
http.get(url, function(res) {
    res.on('data', console.log);  // works!!!
});

有人熟悉幕后发生的事情吗?在这两种情况下如何调用函数?

正如您所指出的,第一个示例的问题在于 log 在设置为 console.[=22 的上下文 (this) 之外不起作用=]

我不确定为什么第二个有效。据我浏览源代码可以看出,这是执行回调的函数:EventEmitter:77. It's setting this to the EventEmitter itself, which doesn't have the _stdout property log is looking for: Console:36。不过,调试并进入 on 可能会回答您的问题。

这里有一些解决此问题的方法示例,供好奇的人参考: 最简单的 (ES5):

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

相同,但使用 ES2016 语法(如果您使用的是 Babel stage 0,则可用):

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

辅助函数 (ES5):

function logger() {
  console.log.apply(console, arguments);
}

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

辅助函数(ES2015):

function logger(...args) {
  console.log(...args);
}

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