2011-09-19 94 views
2

我有這樣的功能:確定其中最大的調用堆棧大小被超過

function _cssIsLoaded(cssStylesheet, stylePath) { 
    var cssLoaded = 0; 
    if (cssStylesheet.href == stylePath){ 
     try { 
      if (cssStylesheet.sheet && cssStylesheet.sheet.cssRules.length > 0) 
       cssLoaded = 1; 
      else if (cssStylesheet.styleSheet && cssStylesheet.styleSheet.cssText.length > 0) 
       cssLoaded = 1; 
      else if (cssStylesheet.innerHTML && cssStylesheet.innerHTML.length > 0) 
       cssLoaded = 1; 
      } 
      catch(ex){ } 
    } 
     if(cssLoaded) { 
      resetPops(); 
      $('#video-overlay').show(); 
      positionElements(); 
      saveBizzmail(); 
     } else { 
      setTimeout(this._cssIsLoaded(cssStylesheet), 200); 
     } 

它是由一個樣式切換功能調用。有時,雖然運行該函數時我會得到錯誤Uncaught RangeError: Maximum call stack size exceeded,。我認爲這一定是因爲它不斷循環,條件永遠不會被滿足?我只是不知道如何調試,並看看它會陷入困境的條件,因爲大多數時候它工作正常。我可以做相當於在該函數中設置斷點,但只有當調用堆棧超過特定大小時才能做到這一點。

這是切換樣式表的功能如果揭示一些光:

function switchTemplate(stylePath){ 
var osid = $('[id^="themeStyle-"]'); 
var stylenum = osid[0].id.split('-')[1]; 
var newstylenum = (Number(stylenum) + 1).toString(); 
var ns = $('<link>', { 
     href: stylePath, 
     id: 'themeStyle-' + newstylenum, 
     type: 'text/css', 
     rel: 'stylesheet' 
    }); 
$("head").append(ns); 
$('#themeStyle-' + stylenum).remove(); 
_cssIsLoaded(ns.get(0), stylePath); 
} 

回答

4

誤差Uncaught RangeError: Maximum call stack size exceeded通常是大約無窮大,或至少過多,遞歸警告。

果然,你有這個問題。該行

setTimeout(this._cssIsLoaded(cssStylesheet), 200); 

不會做你的想法。你希望它的200的延遲後執行this._cssIsLoaded(cssStylesheet),但實際上它立即執行該功能(導致遞歸),然後的延遲後執行它的返回值200

一個簡單的解決方法是

setTimeout(function() { this._cssIsLoaded(cssStylesheet); }, 200); 

這給了setTimeout一個函數對象(它正在尋找它),然後它會在延遲後執行那個函數對象,就像你想要的那樣。

+0

很有道理!我做了改變,但實際上我仍然有同樣的問題,所以還有其他一些問題。 – Damon

+0

其他問題是我在第二次調用_cssIsLoaded時忘記了第二個參數。 – Damon

相關問題