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];

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

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

相关文章

事件冒泡和事件捕获 起因:今天在封装一个bind函数的时候,发现el.addEventListener函数支持第三个参数...
js小数运算会出现精度问题 js number类型 JS 数字类型只有number类型,number类型相当于其他强类型语言...
什么是跨域 跨域 : 广义的跨域包含一下内容 : 1.资源跳转(链接跳转,重定向跳转,表单提交) 2.资源...
@ &quot;TOC&quot; 常见对base64的认知(不完全正确) 首先对base64常见的认知,也是须知的必须有...
搞懂:MVVM模式和Vue中的MVVM模式 MVVM MVVM : 的缩写,说都能直接说出来 :模型, :视图, :视图模...
首先我们需要一个html代码的框架如下: 我们的目的是实现ul中的内容进行横向的一点一点滚动。ul中的内容...