确定超出最大调用堆栈大小的位置

时间:2011-09-19 16:43:43

标签: javascript debugging

我有这个功能:

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,。我认为这必须是因为它不断循环而且条件永远不会得到满足?我只是不确定如何调试并查看它会搞乱的条件,因为大多数时候它工作正常。我是否可以在该函数中设置断点,但仅在callstack超过一定大小时?

这是切换样式表的功能,如果这样可以解决问题:

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);
}

1 个答案:

答案 0 :(得分: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提供了一个函数对象(它正在寻找它),然后它将在延迟之后执行该函数对象,就像你想要的那样。