2011-09-19 81 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

相关问题