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

Raj*_*har 6 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>';
Run Code Online (Sandbox Code Playgroud)

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

jis*_*shi 17

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

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');
Run Code Online (Sandbox Code Playgroud)

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