javascript:控制台日志使用父作用域
是否可以使用一些javascript技巧告诉console.log它应该输出哪个行号 假设我们使用以下简单示例:javascript:控制台日志使用父作用域,javascript,logging,Javascript,Logging,是否可以使用一些javascript技巧告诉console.log它应该输出哪个行号 假设我们使用以下简单示例: function Logger () { this.debug = function(msg) { // do some stuff with msg console.log(msg); }; } var log = new Logger(); log.debug("Hello"); 如果打开页面,Chrome会显示以下内容: 这
function Logger () {
this.debug = function(msg) {
// do some stuff with msg
console.log(msg);
};
}
var log = new Logger();
log.debug("Hello");
如果打开页面,Chrome会显示以下内容:
这表明消息记录在main.js:4
上,但我真正想要的是它显示main.js:9
。因为第9行是调用记录器的地方。
对于这个简单的例子,它没有多大区别,但是当记录器位于单独的文件中时,它总是显示Logger.js
,而不是调用记录器的类
Logger类应该对记录的消息执行一些额外的操作(例如,将其发送到服务器),因此我不能只使用this.debug=console.log
编辑:
已经有一些类似的问题,但所有这些问题都只是在输出中添加了一行,无法单击该行跳转到相应的行:
Error
对象来获取堆栈跟踪,然后找到调用方法的行,如下所示:
function Logger () {
this.debug = function(msg) {
// do some stuff with msg
//TODO: document this line
var callerLine = new Error().stack.split('\n')[2];
console.log(msg, callerLine);
};
}
var log = new Logger();
log.debug("Hello");
基本上,我在每个换行符中拆分错误堆栈,并忽略第一行和第二行(分别是堆栈中的错误消息和您自己的方法)。这是一个尚未完善的解决方案。现在输出为:
Hello athttp://localhost/main.js:12:5 main.js:7
最好只使用相对路径。不幸的是,Error.prototype.stack属性不符合标准,因此这不是有效的解决方案。请参阅:这段代码甚至不适合在生产环境中使用,因为您的JS应该被缩小,尽可能用最少的行来容纳所有内容。这并不是一个跨浏览器的东西,只是一种简化日志记录的方法,所以我不认为这是一个“无效的解决方案”,问题是我使用的是Typescript,它在这一行抱怨TS2339:Property'stack'在type'Error'上不存在。