我一直在开发一个特定于 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 稳定版和 Canary 进行了测试,它在两者上都抛出了相同的错误。当您这样调用它时会出现问题:fn([],"string",function() {})
而不是 fn("string",[],function() {})
我发现第二个参数需要是一个非空字符串,但除此之外,当第二个参数是非空字符串时,第一个和第三个参数是无关紧要的。
我之前也从未提交过错误,这就是为什么我想在我做任何事情之前询问社区是否可以帮助我找出为什么这是一个错误,或者为什么它不是错误。
该函数是这篇 nettuts+ 文章开头那个函数的修改版本。 http://net.tutsplus.com/tutorials/javascript-ajax/from-jquery-to-javascript-a-reference/
最佳答案
代码实际上并没有导致堆栈溢出。如果将 js5.addEvent(...)
行替换为 console.log(element[i]);
控制台中的输出是元素中的每个字符字符串变量。参见 http://jsfiddle.net/WaDWY/
尽管通过链接我相信代码行可能是 fn(...)
。这样做会导致无限递归调用 filter、fn、filter、fn,直到达到最大堆栈大小。请参阅:http://jsfiddle.net/WaDWY/1/
这是意料之中的事情,不是错误。
关于javascript - 自定义事件函数在 Chrome 中的堆栈溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9666578/