当我们开发时需要输出很多log信息,例如使用下面的函数
log = function(msg)
{ console.log(msg);}在发布版中我们不希望打印log,因此在发布版将log函数置空如下
log = function(msg){};但实际上这种方式不能防止参数部分的执行,如调用log(getName()),则其中的getName()无论如何都会被执行。而我希望完全不执行log函数及其参数部分,需要怎么做呢?各位大牛求指导!
log = function(msg)
{ console.log(msg);}在发布版中我们不希望打印log,因此在发布版将log函数置空如下
log = function(msg){};但实际上这种方式不能防止参数部分的执行,如调用log(getName()),则其中的getName()无论如何都会被执行。而我希望完全不执行log函数及其参数部分,需要怎么做呢?各位大牛求指导!
解决方案 »
- 请教一下关于post编码的问题。
- 各位大侠有什么好点的好玩的小例子,分享一下撒
- IE中子节点不显示
- html:textarea
- iframe宽度和div配合问题,期待高手。
- 怎么把问题改成变色的呢?请问
- 请问javascript中有:闭包,prototype和面向对象是学习重点,还有什么呢?
- 如何让日期动态显示???
- 日期输入问题
- EasyUI下面detailview视图下面AppendRow出现问题
- 关于Sublime Text 2.0.1安装插件问题,大神们帮帮忙出出主意啊!!!
- extjs的画图工具Sencha Architect画出来的登陆界面为何老是在左上方,有办法让他在网页中间显示吗
比如这个方法应该写在一个外部单独的js文件里 要调试的页面引入这个js然后调用
发布时检测页面有引入这个js的页面删掉对应的东西??
这个应该不关log的事,你在传参的时候已经调用getName()方法了。
log(getName)
这样应该就OK了吧。
//isDebug
} log = function(msg){
if((/isDebug/).test(debugModen.toString())){
console.log(msg);
}
}
原理是注释在发布时给删除了,debugModen.toString()得不到注释,验证失效。
我想知道的是这种写法log(参数代码段),有没有方法通过改变log函数,达到在运行时不执行参数代码段的效果。在C++中可以通过以下方式忽略参数段的执行
#if DEBUG
#define PRINT printf_s
#else
#define PRINT __noop
#endif那么JS有没有?求各位指点。。
// noLog = false; // development versionlog( noLog ? null : getName());
//all your log line, should have a form:log ( noLog ? null : messageExpression );//By this trick, when noLog is false, messageExpression will not be executed!
// Bug fix for #8, line 11:
//By this trick, when noLog is true, messageExpression will not be executed!
赞!再封装一下应该就OK了,就是写起来有点麻烦哈,不过你启发了我,写成以下方式更方便一些
var nolog = true;
log( nolog && getName() )另外,还是想看看有没有改变log这个函数的方式达到我的目的~~ 如果没有的话就结贴了
Function.prototype.log= function () {
var _self = this;
//屏蔽下面语句再试验
console.log(_self.apply(this,arguments));
}
function test() {
console.log("test is run!!");
return "test";
} function sum(a ,b) {
console.log("sum is run!!");
return a+b;
} test.log();
sum.log(10,100);
console.log(sum(10,100));
//屏蔽下面语句再试验
//console.log(this.apply(this,arguments));
}
你可能误解了我的意思了,我是想要一种方法可以不执行函数及其参数段,即代码
funA(funB());中的funB()不被执行。
而你的代码只是改变了.log函数的功能,并不能达到
test.log(funB());中的“funB()”不执行的效果。~~~
sum.log(10,100);
在Function.prototype.log 中判断是否继续执行本函数。
但不会影响sum(10,100);
比如sum.log(getNum1(), getNum2()); 我想要一种方法可以不执行getNum1(), getNum2()这两个函数
好吧确实可以,不过这种写法已经影响到代码可读性了,另外对Function的改动其实只能影响到函数,而不能影响到如a+b这种通用代码段 如sum.log( a+b, c*d)
var flag=true|false (看發怖版本而定)log = function(msg){
if(flag=true){
console.log(msg);
}}
if(arguments.length==1 && typeof arguments[0] !="function"){
console.log(arguments[0]);
return;
}
var back;
if(typeof arguments[0] =="function"){
console.log(Array.slice(arguments,1));
back =arguments[0].apply(arguments[0],Array.slice(arguments,1));
}else if(arguments.length>2 && (typeof arguments[1] =="function")){
var fn = arguments[1];
var args= Array.slice(arguments,2);
back =fn.apply(arguments[0],args);
}
console.log(back);
return back;
}/*********************************/
function test() {
console.log("test is run!!");
return "test";
}
function sum(a ,b) {
console.log("sum is run!!");
return a+b;
}var person={
age:10,
say:function (str) {
return str + this.age;
}
};log("Test start!");
log(test);
log(sum,10,100);
log(person,person.say,"My age is");
================
这个已经有点钻牛角尖了吧。你代码会log这个?
log一般就当监视器用吧。当计算器的场合可以忽略不计了。
log(msg);
我觉得我有必要解释一下,在两种场合需要去掉log或者说去除掉log对性能影响:
1、对外发布版,需要完全去掉log函数,这点用正则表达式直接删log部分代码是可行的,但是这种写法
var msg = getName();
log(msg);
则会有问题。如果msg纯粹是为打印log准备的数据(没有在其他地方被引用)则应该删除语句以减少消耗,然而这种写法无法用简单的方式检测到这段无用代码并且给予删除。因此我会选择
log(getName());
这种方式只有一行,这是有利于对外发布版时删除log的。2、开发中控制log等级,此时没必要用删除的手段,当控制log等级时我会将部分log函数置空或重新定义函数如下:
log.info = function(msg){};
log.info = function(msg){console.log(msg);}
二者可以根据情况选择。但这种方式没法完全去掉参数部分的执行消耗,当参数部分是一个函数时【如log(getName())】,尤其这个函数代价较大时,这种消耗就更应该去掉。同理,较长的或者消耗较大的表达式也最好去掉如
log.info("arguments of func TEST: name="+name+" arg1="+arg1+" arg2="+arg2+" result="+result);
可能arg1是某种长字串,那么大量字串的连接也是有性能消耗的————这就引发我的问题,如何完全不执行参数部分呢?jswatcher给出的方法可以用于明确知道函数代价较大时使用,而且消耗小(编写时只要额外添加一小段语句,执行时用一个判断语句取代整个参数段的执行,可读性强),勉强可以达到要求。
而ftiger提供的方法不像是个log函数,而是个代码执行器了,需要拆分函数和参数来使用,而且确实无法用于长表达式的情况。也有可能是我表述不清使你误解,这里表示抱歉了。就此结贴,虽然没有类似C++的方案,毕竟脚本有其自身特点,不过还是很感谢各位!