javascript - Firefox 在 for 循环中抛出 js 错误 "allocation size overflow"

标签 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>';

我试过寻找无限循环但没有成功。非常相同的代码在本地服务器上运行。

最佳答案

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

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 是什么),但无论如何避免循环中的字符串连接从来都不是一个坏主意。

关于javascript - Firefox 在 for 循环中抛出 js 错误 "allocation size overflow",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27645489/

相关文章:

javascript - 如何使用 Handlebars.js( mustache 模板)制作 i18n?

arrays - Matlab:重复行和列并将其连接到新数组中

c - 在 "for"循环内,如何在索引器每次计数 "x"单位时递增另一个变量?

r - 在R的替换功能中是否真的将数据复制了四次?

c - 汇编语言中的内存地址是一次性静态分配的吗?

Javascript - 基于 _id 的排序数组对 Javascript 对象进行排序的更快、更有效的方法?

javascript - 如果只有一个错误类,如何选择输入内容

java - 嵌套循环未按预期工作?

c++ - 如何跟踪 C++ 标准库调用的内存分配?

javascript - 只有第一个随机引用淡入