Chrome中的Stack Overflow来自自定义事件功能

时间:2012-03-12 11:57:07

标签: javascript google-chrome

我一直在研究一个特定于webkit的库,在我的测试中,我不小心把两个参数放错了顺序,不知何故导致堆栈溢出而不是错误。我想知道社区是否可以向我提供一些见解,说明为什么在我提交错误之前这可能导致Chrome中的堆栈溢出。

var fn = function (eventType, element, callback) {
    var filter = function(eventType, element, callback) {
        var length = element.length;
        for(var i=0;i<length;i++) {
            fn(eventType, element[i], callback);
        }
    };
    if ( element && element.nodeName || element === window ) {
        element.addEventListener(eventType, callback, false);
    } else if (element && element.length) {
        filter(eventType, element, callback);
    }
};

我已经针对Chrome stable和Canary对此进行了测试,但两者都出现了相同的错误。当您这样调用时会出现此问题:fn([],"string",function() {})而不是fn("string",[],function() {})

我发现第二个参数需要是一个非空字符串,但除了第二个参数与非空字符串无关时,第一个和第三个参数无关。

我以前也从未提交过错误,这就是为什么我会问社区他们是否可以帮助我找到为什么这是一个错误,或者为什么它不是一个错误,在我做任何事情之前。

该功能是此nettuts +文章开头的修改版本。 http://net.tutsplus.com/tutorials/javascript-ajax/from-jquery-to-javascript-a-reference/

1 个答案:

答案 0 :(得分:2)

代码实际上不会导致堆栈溢出。如果用js5.addEvent(...)替换console.log(element[i]);行,则控制台中的输出是元素字符串变量中的每个字符。见http://jsfiddle.net/WaDWY/

虽然从链接开始,我认为代码行可能是fn(...)。这样做会导致无限递归调用filter,fn,filter,fn一遍又一遍,直到达到最大堆栈大小。请参阅:http://jsfiddle.net/WaDWY/1/

这是预期的而不是错误。