我采取了一些不同的方法,只是定义了一个属性,通过故意抛出一个错误来设置一个 __stack__ 变量,从中我们可以获取文件名、行号(以及许多其他内容,例如调用者及其行号,如果您选择实施它们)。
另外,我没有设置日志函数,而是将其设置为一个变量,但设置时会被记录。这将是设置 LOG 的位置,而不是定义位置。
就像 LOG="my message" 一样简单。然后您可以稍后将其用作变量,以通过alert(LOG)获取上次调试的位置
/*@const*/ //for closure-compiler
DEBUG=2 // 0=off, 1=msg:file:line:column, 2=msg:stack-trace
if(DEBUG){
/*@const @constructor*/
Object.defineProperty(window,'__stack__',{get:function(){
try{_ფ_()}catch(e){return e.stack.split(":")}
}})
/*@const @constructor*/
Object.defineProperty(window,'__file__',{get:function(){
var s=__stack__,l=s.length
return (isNaN(s[l-2]))?s[l-2]:s[l-3]
}})
/*@const @constructor*/
Object.defineProperty(window,'__line__',{get:function(){
var s=__stack__,l=s.length
return (isNaN(s[l-2]))?s[l-1]:s[l-2]
}})
/*@const @constructor*/
Object.defineProperty(window,'__col__',{get:function(){
var s=__stack__,l=s.length
return (isNaN(s[l-2]))?"NA":s[l-1]
}})
/*@const @constructor*/
Object.defineProperty(window,'LOG',{
get:function(){return out},
set:function(msg){if(DEBUG>1)out=msg+"\t-\t"+__stack__
else out=msg+" in file:"+__file__+" @ Line:"+__line__+", Column:"+__col__
console.log(out)}
})
}//end if(DEBUG)