2012-03-12 48 views
1

我一直工作在一個特定的WebKit庫,並在我的測試中,我不小心把兩個參數順序錯誤,並以某種方式導致堆棧溢出,而不是錯誤。我想知道,在我提交bug之前,社區是否可以向我提供一些見解,說明爲什麼這可能導致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穩定和金絲雀,它在兩個引發同樣的錯誤。比第一和第三個參數是不相關的第二時fn([],"string",function() {}),而不是fn("string",[],function() {})

什麼我發現是第二個參數必須是一個非空字符串,但其它:當你調用它像這樣出現的問題是一個非空字符串。

我還從來沒有建檔的錯誤,這就是爲什麼我想我會問社區,如果他們能幫助我找到爲什麼這是一個錯誤,或者爲什麼它是不是一個錯誤,在我做了什麼。

功能爲一個在此NETTUTS +文章的開頭的修改版本。 http://net.tutsplus.com/tutorials/javascript-ajax/from-jquery-to-javascript-a-reference/

回答

2

的代碼實際上並沒有導致堆棧溢出。如果將js5.addEvent(...)行替換爲console.log(element[i]);,則控制檯中的輸出是元素字符串變量中的每個字符。請參閱http://jsfiddle.net/WaDWY/

雖然從跟隨鏈接我相信代碼行可能是fn(...)而不是。這樣做會導致無限遞歸調用filter,fn,filter,fn,直到達到最大堆棧大小。請參閱:http://jsfiddle.net/WaDWY/1/

這是可以預期,而不是一個錯誤。

+0

哎呀,我的壞與js5.addEvent線仍然在那裏住,我從圖書館直接把它移植,而忽視對其進行測試。它應該是對自身的遞歸調用。謝謝你指出我。 謝謝你的解釋,這對我來說非常有意義。我知道如何對if語句進行簡單的修改以防止不必要的遞歸,我只是對錯誤的來源感到好奇。 – ArkahnX 2012-03-12 21:59:39