(很久没写东西,这里写一个自己熟悉的内容做2016的开篇吧)
相对于其他语言,js似乎很少有需要打印调用堆栈的时候,反正我是做了这么多年了前端,第一次用到,其他情况,基本都可以通过更好的方式来调试
今天面对的问题是这样的,有一个“ad_list”事件,在不停的触发,触发它的地方有N个,触发条件也不一样,靠简单的“console.log”,太多,可读性很差,所以想到了调用堆栈
不过,由于js里大部分是匿名函数,打印出来的堆栈并不像java、php一样简介。。。,打印名字不靠谱,而是,直接打印function内容,然后靠内容反查。。。。这就是很少有人用这一招的原因
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | if(action == 'ad_list'){//打印特定条件的堆栈 var caller = arguments.callee.caller, j = 0, s; while (caller) { j++; if(typeof caller == 'function' || typeof caller == 'object'){ s = (caller + '');//function变成字符串 //排除系统函数、框架函数 if(s.indexOf('function (event)') < 0 && s.indexOf('function (packet)') < 0 && s.indexOf('fn.apply') < 0){ console.log('【function】-----stack-----------', j, ': ', (caller + '').substr(0, 200));//打印funciton的前半截 } } caller = caller && caller.caller;//取下一级 if(j > 500){//限定数量 --- 这个一定不要漏了 return; } } } |
————
查了半天(真是半天)的问题,结果是自己给自己挖的坑:默认的图片/活动名称是按规约命名的,但是测试图省事没照这个规则做,才造成上面说的不停的刷新同一个东西。。。。。。