Firefox在for循环“分配大小溢出”中抛出js错误

时间:2014-12-25 08:22:10

标签: javascript for-loop memory-management runtime-error

以下是我的代码

相同的代码在本地服务器中工作,但不在实时。

    htmlC = "";
    htmlC += '<select name="pagenum" id="pagenum" style="width:135px" onChange="setPageSearchValue(this.value)">';
    for(i=1 ; i<=tot_pages ; i++)
    {
            if(i.toString() == document.frmlist.start.value)
            {
                htmlC += "<option value='"+i+"' 'selected' >"+i+"</option>";
            }
            else
            {
                htmlC += "<option value='"+i+"'>"+i+"</option>";
            }
    }   
    htmlC += '</select>';

我试过找到无限循环但没有成功。完全相同的代码在本地服务器上工作。

2 个答案:

答案 0 :(得分:16)

以这种方式使用字符串连接通常是一个坏主意,特别是如果您不知道将要执行的迭代次数。每次连接一个字符串时,你将重新分配适合新字符串所需的内存,并且需要对旧字符串进行垃圾收集(出于性能原因,这可能甚至不会在循环期间完成)

var htmlBuffer = [];
htmlBuffer.push('<select name="pagenum" id="pagenum" style="width:135px" onChange="setPageSearchValue(this.value)">');
for(i=1 ; i<=tot_pages ; i++)
{
        if(i.toString() == document.frmlist.start.value)
        {
            htmlBuffer.push("<option value='"+i+"' 'selected' >"+i+"</option>");
        }
        else
        {
            htmlBuffer.push("<option value='"+i+"'>"+i+"</option>");
        }
}   
htmlBuffer.push('</select>');

htmlC = htmlBuffer.join('\n');

上面将定义一个数组,将每个“行”推到其上。它将动态分配扩展数据所需的内存,最后,为总数据量分配1个字符串。这样效率更高。我不知道这是否是您案例中的实际问题(因为我们不知道tot_pages是什么),但是无论如何避免循环中的字符串连接绝不是一个坏主意。

答案 1 :(得分:1)

添加注释,在另一个循环中使用格式错误的 do..while 进行循环时,可能会抛出此错误。

对于记录,以下代码段在删除 i ++ 时会抛出此错误,或者中的错误情况。

.so