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);
我在玩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);