当前位置: 首页 > 面试题库 >

使用正确的行号为console.log正确包装吗?

徐兴昌
2023-03-14
问题内容

我现在正在开发应用程序,并进行全局isDebug切换。我想包装起来console.log以方便使用。

//isDebug controls the entire site.
var isDebug = true;

//debug.js
function debug(msg, level){
    var Global = this;
    if(!(Global.isDebug && Global.console && Global.console.log)){
        return;
    }
    level = level||'info';
    Global.console.log(level + ': '+ msg);
}

//main.js
debug('Here is a msg.');

然后,我在Firefox控制台中得到此结果。

info: Here is a msg.                       debug.js (line 8)

如果我想使用debug()被呼叫的行号登录该info: Here is a msg. main.js (line 2)怎么办?


问题答案:

这是一个古老的问题,提供的所有答案都太过分了,存在跨浏览器的重大问题,并且没有提供任何超级有用的东西。该解决方案可在每种浏览器中使用,并完全按需报告所有控制台数据。无需黑客,只需一行代码即可签出codepen。

var debug = console.log.bind(window.console)

像这样创建开关:

isDebug = true // toggle this to turn on / off for global controll

if (isDebug) var debug = console.log.bind(window.console)
else var debug = function(){}

然后只需调用如下:

debug('This is happening.')

您甚至可以通过以下开关来接管console.log:

if (!isDebug) console.log = function(){}

如果您想对此做一些有用的事情,则可以添加所有控制台方法,并将其包装在可重用的函数中,该函数不仅提供全局控制,而且还提供类级别:

var Debugger = function(gState, klass) {

  this.debug = {}

  if (gState && klass.isDebug) {
    for (var m in console)
      if (typeof console[m] == 'function')
        this.debug[m] = console[m].bind(window.console, klass.toString()+": ")
  }else{
    for (var m in console)
      if (typeof console[m] == 'function')
        this.debug[m] = function(){}
  }
  return this.debug
}

isDebug = true //global debug state

debug = Debugger(isDebug, this)

debug.log('Hello log!')
debug.trace('Hello trace!')

现在,您可以将其添加到您的班级中:

var MyClass = function() {
  this.isDebug = true //local state
  this.debug = Debugger(isDebug, this)
  this.debug.warn('It works in classses')
}


 类似资料:
  • 我一直在研究封装的概念,发现了一些关于这个主题的不错的线索,比如这个和这个。但我还没能找到一个具体问题的答案。我将使用Swift中的一个示例。 假设你有一个RoadTrip类型的对象: 现在让我们假设应用程序将计算,这是唯一的公共属性: 每加仑平均英里数的计算是RoadTrip对象执行和更新其的私有方法,还是可以接受由单独实用程序类中的另一个方法执行计算,然后更新RoadTrip的属性对象是否使用

  • 问题内容: 我试图了解Java 8中API 的方法。 我有简单的逻辑: 但这会导致编译错误: 我当然可以做这样的事情: 但这就像混乱的支票一样。 如果我将代码更改为此: 代码变得越来越脏,这让我想到了回到旧支票。 有任何想法吗? 问题答案: 需要作为参数。您正在向其传递类型为void的表达式。因此,它不会编译。 使用者应被实现为lambda表达式: 甚至更简单,使用方法参考: 这基本上与 想法是仅

  • 问题内容: 我正在尝试了解的语义,以及实体管理器对未保存的瞬态实例的确切含义。我要实现的只是向会话添加一个新的临时实例,并在刷新会话时让Hibernate执行一个。 我发现如果持久保存一个新实例,然后在同一会话中对其进行修改,则实体管理器将同时生成和语句,这可能会导致约束冲突。 例如,假设我有一个带有列 栏 和以下服务方法的实体关系 Foo 。 __ 尽管我们为提供了一个值,但是执行此代码将违反数

  • 问题内容: 什么时候应该从而不是从中导出例外? 不必在方法的子句中声明A ,因为它不一定要专门列出,否则可能是 好 方法,也可能是 不好的, 因为显式声明方法的异常是一种好习惯。 有什么想法吗? 问题答案: 来自未经检查的异常- 争议 : 如果可以合理预期客户端会从异常中恢复,请将其设置为已检查的异常。如果客户端无法采取任何措施来从异常中恢复,请将其设置为未经检查的异常。 请注意,未检查的异常是从

  • 我读过几本教程,也读过@mattt的自述,但我还是搞不懂几件事。 > 在实际API中的正确用法是什么?看起来,如果我将通过为所有API实现 协议来创建一个路由器,那么它将几乎不可读。是否应该为每个endpoint创建一个路由器? 第二个问题很可能是由于缺乏使用Swift语言的经验引起的。我不明白为什么要用 来构建路由器?为什么我们不将类与静态方法一起使用?这里有一个例子(来自Alamofire's

  • 我正试图将maven V3.5.4安装到我的计算机上,每当我尝试'mvn-version'命令时,我会得到 “MVN”不被识别为内部或外部命令、可操作程序或批处理文件。 我已经查阅了关于如何做到这一点的多个教程,他们提供了几乎相同的信息。添加系统变量M2和M2_HOME,然后向Path系统变量追加一个目录。我将系统变量配置为: null null null null 我的路径变量是: 我不知道如何