function log( msgOrObj ){ if(dev_mode){ console.log({ 'message': msgOrObj,'caller': arguments.callee.caller.toString() }); } }
所以,我试图编写一个简单的自定义控制台日志功能(如上所述).但是我很难找到调用者来自哪个文件和行.我能看到的最大的功能就是调用它.
有没有人做过类似的事情?还是甚至有可能?
来自第70行的somescript.js中使用的示例:
log('some very important message!')
解决方法
我看到可靠地提取这种信息的唯一方法是抛出一个错误,然后从堆栈跟踪中提取调用者信息,其中的一些方面如下:
function log( msgOrObj ){ if(dev_mode){ try { in_val_id(); // force an error by calling an non-existent method catch(err) { // some regex/string manipulation here to extract function name // line num,etc. from err.stack var caller = ... var lineNo = ... } console.log({ 'message': msgOrObj,'caller': caller,'lineNo': lineNo }); } }
Chrome中的堆栈是这样的:
ReferenceError: in_val_id is not defined at log (<anonymous>:4:13) at <anonymous>:2:14 at <anonymous>:2:28 at Object.InjectedScript._evaluateOn (<anonymous>:581:39) at Object.InjectedScript._evaluateAndWrap (<anonymous>:540:52) at Object.InjectedScript.evaluate (<anonymous>:459:21)
caller = err.stack.split('\n')[3].split('at ')[1].split(' (')[0];
在这里使用正则表达式可能更具性能.您可能需要不同的方法来使用不同的浏览器来提取此信息.
一句警告虽然;抛出和处理错误是昂贵的,因此以这种方式输出大量日志消息可能会影响一般性能,尽管如果专门用于调试模式,这可能是可以接受的