javascript – 自定义控制台日志功能,一个console.log包装器

前端之家收集整理的这篇文章主要介绍了javascript – 自定义控制台日志功能,一个console.log包装器前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
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];

在这里使用正则表达式可能更具性能.您可能需要不同的方法来使用不同的浏览器来提取此信息.

一句警告虽然;抛出和处理错误是昂贵的,因此以这种方式输出大量日志消息可能会影响一般性能,尽管如果专门用于调试模式,这可能是可以接受的

猜你在找的JavaScript相关文章