BetterJS / badjs-report

monitor error and report
MIT License
1.14k stars 193 forks source link

bj-report-tryjs-1.3.1: [BJ-REPORT] TypeError: foo.apply is not a function #28

Closed henix closed 7 years ago

henix commented 7 years ago

版本:最新的 1.3.1

浏览器:Linux Chrome

调用:

head 里:

BJ_REPORT.init({ id: 4, url: "******/badjs", ignore: [/Script error/i], repeat: 20 });

body 里:

BJ_REPORT.tryJs().spyAll();

页面里用了 jquery 和 seajs ,spyAll 是在最后调用的。页面只要 resize 就会抛出如下异常:

[BJ-REPORT] TypeError: foo.apply is not a function
    at http://******/lib/badjs-report/1.3.1/bj-report-tryjs.js:604:28

查看源代码后发现是这一段:

var cat = function(foo, args) {
        return function() {
            try {
                return foo.apply(this, args || arguments);
            } catch (error) {

                _onthrow(error);

                //some browser throw error (chrome) , can not find error where it throw,  so print it on console;
                if (error.stack && console && console.error) {
                    console.error("[BJ-REPORT]", error.stack);
                }

                // hang up browser and throw , but it should trigger onerror , so rewrite onerror then recover it
                if (!timeoutkey) {
                    var orgOnerror = global.onerror;
                    global.onerror = function() {};
                    timeoutkey = setTimeout(function() {
                        global.onerror = orgOnerror;
                        timeoutkey = null;
                    }, 50);
                }
                throw error;
            }
        };
    };

调试后发现 foo 为整数 1000 ,args 为整数 0 。

loskael commented 7 years ago

@henix 最好能提供一个能重现的 demo

看了一下源码,最有可能出错的地方是这里: https://github.com/BetterJS/badjs-report/blob/770efee05648d7682299f6006f18ede0f7eff729/dist/bj-report-tryjs.js#L652

@miniflycn 看看

henix commented 7 years ago

好的,我试试看能不能搞一个 demo

caihuiji commented 7 years ago

这种我之前类似反馈,是在调用某些方法的时候 传递的 function 是为空 例如 setTimeout(null , 0) , 就会抛出这种错误

@henix 看看是不是有类似的代码

image

henix commented 7 years ago

对,我在构造 case 的时候发现了这个问题。代码里调用 setTimeout 的时候参数传反了...

setTimeout(1000, function() { ... });
miniflycn commented 7 years ago

呃,这个问题我们没想过……