console.log的执行上下文

时间:2015-09-17 18:22:53

标签: javascript 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!!!
});

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

1 个答案:

答案 0 :(得分:0)

第一个示例的问题与您指出的一样,是log在上下文(this)设置为console之外无效。

我不确定为什么第二个有效。从略读源代码我可以看出,这是执行回调的函数:EventEmitter:77。它将this设置为EventEmitter本身,它没有_stdout属性log正在寻找:Console:36。但是,调试和步入on可能会回答您的问题。

以下是一些解决此问题的方法示例: 最简单的(ES5):

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

相同,但使用ES2016语法(如果您使用的是Babel阶段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);