Javascript 动态启用/禁用调试代码

Javascript 动态启用/禁用调试代码,javascript,ajax,debugging,dynamic,Javascript,Ajax,Debugging,Dynamic,我正在编写一个相当大的JavaScript动画库,我想在其中包含调试代码。我可以很容易地做一个检查: if(myLib.debugger){ console.warn('warning message'); } 但是,如果每秒运行数千次,最终会导致性能问题。在代码中再加上一些检查,效果会更加明显 我想知道的是,如果调试器应该启用,是否可以检查onload,如果是的话。。。像这样转: //debugger if(!this.name) console.warn('No name provi

我正在编写一个相当大的JavaScript动画库,我想在其中包含调试代码。我可以很容易地做一个检查:

if(myLib.debugger){
   console.warn('warning message');
}
但是,如果每秒运行数千次,最终会导致性能问题。在代码中再加上一些检查,效果会更加明显

我想知道的是,如果调试器应该启用,是否可以检查onload,如果是的话。。。像这样转:

//debugger if(!this.name) console.warn('No name provided');
进入:

如果代码未启用,则保留注释;如果启用,则取消注释,从而消除任何可能的性能问题。如果通过ajax加载,是否可以在整个脚本上使用正则表达式来实现这一点?我试图避免需要两个版本的相同代码,lib.dbug.js和一个lib.js

跨浏览器兼容性对此并不重要(我真的只担心新的浏览器),我认为拥有这个项目很好。然而,如果可能的话,拥有它将是一件很棒的事情


任何洞察都将不胜感激。

执行此操作的最简单方法是检查是否应禁用调试器,如果应禁用调试器,则将其替换为在脚本开始时不执行任何操作的模拟对象:

if (!myLib.debugger) {
    window.console = (function () {
        var newConsole = {};
        var key;

        for (key in window.console) {
            if (typeof window.console[key] === 'function') {
                newConsole[key] = function () {};
            }
        }

        return newConsole;
    }());
}

这种方法的开销应该可以忽略不计。

最简单的方法是检查是否应该禁用调试器,如果应该禁用调试器,则将其替换为在脚本开始时不执行任何操作的模拟对象:

if (!myLib.debugger) {
    window.console = (function () {
        var newConsole = {};
        var key;

        for (key in window.console) {
            if (typeof window.console[key] === 'function') {
                newConsole[key] = function () {};
            }
        }

        return newConsole;
    }());
}

这种方法的开销应该可以忽略不计。

如果这是一个JavaScript库。。。然后,作为第三方开发人员,我希望能够下载/使用2个版本。生产版本(无调试,最小化)。如果我想调试,我会指向库的调试版本

e、 g


如果这是一个JavaScript库。。。然后,作为第三方开发人员,我希望能够下载/使用2个版本。生产版本(无调试,最小化)。如果我想调试,我会指向库的调试版本

e、 g



如果我这样做,我将禁用最终用户可能希望显示的所有警告。我可以很容易地看到有人想要禁用我的调试代码,但仍然会显示一些代码。@ericjbasti如果您在闭包中运行代码(函数(){…}())习惯用法),那么您可以创建一个本地
控制台
,该控制台只能由您自己的代码访问<代码>变量控制台;如果(myLib.debugger){console=window.console;}或者{console=/*答案中构建模拟控制台的代码*/}很有趣,我甚至没有想到这条路径。这可能就是问题所在,我必须对此进行测试。在纯“反代码kruft”任务中,我仍然会确保此库的生产版本不包含死代码或大量注释。“这对发展很好,但应该被剥离出来用于生产。”斯肯利夫作为一个理论家,我同意。作为一个实用主义者,只有当no op调试代码导致问题时才删除它。如果我这样做,我会禁用最终用户可能希望显示的所有警告。我可以很容易地看到有人想要禁用我的调试代码,但仍然会显示一些代码。@ericjbasti如果您在闭包中运行代码(函数(){…}())习惯用法),那么您可以创建一个本地
控制台
,该控制台只能由您自己的代码访问<代码>变量控制台;如果(myLib.debugger){console=window.console;}或者{console=/*答案中构建模拟控制台的代码*/}很有趣,我甚至没有想到这条路径。这可能就是问题所在,我必须对此进行测试。在纯“反代码kruft”任务中,我仍然会确保此库的生产版本不包含死代码或大量注释。“这对发展很好,但应该被剥离出来用于生产。”斯肯利夫作为一个理论家,我同意。作为一个实用主义者,只有在出现问题时才删除no-op调试代码。我同意,这可能是我必须遵循的路径。。。我想我只是想避免管理两份副本。我同意,这可能是我必须遵循的路径。。。我想我只是想避免管理2个副本。使用一个名为debug()的简单包装器,而不是console.warn(),对于生产环境,设置debug=Boolean;似乎最好的解决方案是使用多个文件管理此代码,我只需要编写一个好的宏或其他东西来删除可部署+可读版本中的所有
控制台
调用。如果缩小版本自动删除所有注释,那就太好了。使用一个名为debug()的简单包装器,而不是console.warn(),对于生产,设置debug=Boolean;似乎最好的解决方案是使用多个文件管理此代码,我只需要编写一个好的宏或其他东西来删除可部署+可读版本中的所有
控制台
调用。如果缩小版能自动删除所有评论,那就太好了,不过哦,好吧。
<script src="foo-lib-min.js"></script>
<!-- swap to this for debugging <script src="foo-lib-full.js"></script>-->