[英]How to bind console.log to another function call so I can see line number of the script in console where it is called?
我的代码有效,但有额外的括号,如myfunction()();
. 它应该像正常情况一样用单括号执行,例如myfunction();
.
我正在构建console.time(); console.timeEnd();
console.time(); console.timeEnd();
用于没有本机内置的浏览器(例如 <IE10)的 polyfill。 注意:我有 bind() polyfill 以防你认为 <IE10 没有它。
这是我在“polyfill.js 文件”中的代码。
(function() {
'use strict';
var console=window.console, timers={};
if (!console.time) {
console.time = function(name) {
var datenow = Date.now();
name = name? name: 'default';
if (timers[name]) {
console.warn('Timer "'+name+'" already exists.');
}
else timers[name] = datenow;
};
console.timeEnd = function(name) {
var datenow = Date.now();
name = name? name: 'default';
if (!timers[name]) {
console.warn('Timer "'+name+'" does not exists.');
}
else {
var endt = datenow - timers[name];
delete timers[name];
//below is the line where some changes are needed, But I don't know how.
return window.console.log.bind(window.console, name+ ': ' +endt+ 'ms');
}
};
}
}());
现在在另一个文件“main.js 文件”中,当我使用console.time(); console.timeEnd();
console.time(); console.timeEnd();
,它应该在浏览器控制台中记录此文件的代码行号(而不是 polyfill.js 文件的行号)。 当然它可以工作,但请注意下面的附加括号“()()”并不酷。
console.time();
//any code for performance test goes here.
console.timeEnd()(); //Note here "()()". It should be single "()"
我已经咨询了这 2 个 stackoverflow 问题,但无法得出正确答案。
我还检查了new Error().stack;
作为一个选项,但我正在为其构建 polyfill 的那些浏览器也不支持它。
注意:如果有人可以用eval();
, 你可以。 这对我来说也是可以接受的。
实际上有一个名为console.trace
的 function,您可以在MDN 页面中阅读更多相关信息。 它所做的是将整个堆栈跟踪打印到调用它的行。
因此,例如,运行下一个代码:
function firstFunc() {
secondFunc();
}
function secondFunc() {
console.trace('I was called here!');
}
console.log('Calling firstFunc:');
firstFunc();
将在控制台中打印出这个 output:
Calling firstFunc:
I was called here!
secondFunc @ VM141:6
firstFunc @ VM141:2
(anonymous) @ VM141:10 // Internal browser trace
请注意,在给定的 output 中,所有函数都在 Chrome 控制台中被调用和定义,因此@ VM141:
。 通常,它打印文件而不是 VM。 因此,如果它位于index.js
文件中,它将如下所示:
Calling firstFunc:
I was called here!
secondFunc @ index.js:8
兼容性说明
上述方法适用于任何健全的浏览器,以及 IE11+。 这是由于仅在 IE11 中实施了console.trace
。 但是,根据 OP 的要求,我可以想到一种支持 IE10 的创造性方法,那就是使用Error.prototype.stack
属性。 现在,当然,正如 MDN 本身提到的那样,它是一个不应该在生产中使用的非标准功能,但也不支持 IE6。
通过创建一个 Error 实例然后打印它的堆栈,您可以获得类似的结果。
const sumWithTrace = (num1, num2) => {
console.log(new Error().stack); // Creating a new error for its stack property
return num1 + num2;
};
sumWithTrace(1, 5); // returns 6 and prints trace in console
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.