我正在玩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!!!
});
有谁熟悉幕后发生的事情?如何在这两种情况下调用函数?
答案 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);