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

我现在正在开发应用程序,并进行全局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')

}

以上是 使用正确的行号为console.log正确包装吗? 的全部内容, 来源链接: utcz.com/qa/410702.html

回到顶部