Я выбрал немного другой подход и просто определил свойство, которое устанавливает переменную __stack__, преднамеренно выдавая ошибку, из этого мы можем получить имя файла, номер строки (и многие другие, такие как вызывающие абоненты и их номера строк, если вы выбираете реализовать их).
Кроме того, вместо того, чтобы настраивать функцию журнала, я также настраиваю ее как переменную, но такую, которая регистрируется при установке. Это будет место, где установлен LOG, а не там, где он был определен.
Это так же просто, как LOG = "мое сообщение". Затем вы можете использовать его позже как переменную, чтобы получить местоположение вашей последней отладки с 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)