Joh*_*ohn 15 javascript debug-backtrace
function log( msgOrObj ){
if(dev_mode){
console.log({
'message': msgOrObj,
'caller': arguments.callee.caller.toString()
});
}
}
Run Code Online (Sandbox Code Playgroud)
所以,我试图编写一个简单的自定义控制台日志功能(如上所述).但是我很难找到调用者来自哪个文件和行.我能看到的最多就是调用它的函数.
有没有人做过类似的事情?或者这甚至可能吗?
第70行的somescript.js中使用的示例:
log('some very important message!')
Run Code Online (Sandbox Code Playgroud)
是的,但它非常hacky 并且不跨浏览器安全。您可以以此为起点。它借鉴了这个答案。
window.trace = function stackTrace() {
var err = new Error();
return err.stack;
}
window.my_log = function (x) {
var line = trace();
var lines = line.split("\n");
console.log(x + " " + lines[2].substring(lines[2].indexOf("("), lines[2].lastIndexOf(")") + 1))
}
window.my_log("What light through yonder window breaks?")
Run Code Online (Sandbox Code Playgroud)
产生:
What light through yonder window breaks? (<anonymous>:2:42)
Run Code Online (Sandbox Code Playgroud)
小智 2
所以,这就是我最终想要的(其中shout是一个仅在开发模式下运行的定制函数):
function log( msgOrObj ){
if(dev_mode){
if( typeof(window.console) != 'undefined' ){
try { invalidfunctionthrowanerrorplease(); }
catch(err) { var logStack = err.stack; }
var fullTrace = logStack.split('\n');
for( var i = 0 ; i < fullTrace.length ; ++i ){
fullTrace[i] = fullTrace[i].replace(/\s+/g, ' ');
}
var caller = fullTrace[1],
callerParts = caller.split('@'),
line = '';
//CHROME & SAFARI
if( callerParts.length == 1 ){
callerParts = fullTrace[2].split('('), caller = false;
//we have an object caller
if( callerParts.length > 1 ){
caller = callerParts[0].replace('at Object.','');
line = callerParts[1].split(':');
line = line[2];
}
//called from outside of an object
else {
callerParts[0] = callerParts[0].replace('at ','');
callerParts = callerParts[0].split(':');
caller = callerParts[0]+callerParts[1];
line = callerParts[2];
}
}
//FIREFOX
else {
var callerParts2 = callerParts[1].split(':');
line = callerParts2.pop();
callerParts[1] = callerParts2.join(':');
caller = (callerParts[0] == '') ? callerParts[1] : callerParts[0];
}
console.log( ' ' );
console.warn( 'Console log: '+ caller + ' ( line '+ line +' )' );
console.log( msgOrObj );
console.log({'Full trace:': fullTrace });
console.log( ' ' );
} else {
shout('This browser does not support console.log!')
}
}
}
Run Code Online (Sandbox Code Playgroud)
log() 在应用程序的其余部分之前声明时,可以在应用程序内的任何位置调用,并为开发人员提供所需的所有信息,而且不会退出开发模式。
(http://webconfiguration.blogspot.co.uk/2013/12/javascript-console-log-wrapper-with.html)
归档时间: |
|
查看次数: |
9540 次 |
最近记录: |