Monthly Archives: 一月 2016

Hello World

js调试之~打印调用堆栈

(很久没写东西,这里写一个自己熟悉的内容做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;
      }
    }
  }

————
查了半天(真是半天)的问题,结果是自己给自己挖的坑:默认的图片/活动名称是按规约命名的,但是测试图省事没照这个规则做,才造成上面说的不停的刷新同一个东西。。。。。。