代码之家  ›  专栏  ›  技术社区  ›  Kubi

我的JavaScript对象太大

  •  4
  • Kubi  · 技术社区  · 15 年前

    我正在页面加载上创建一个非常大的JavaScript对象。我在firefox上没有收到任何错误,但在Internet Explorer上,我收到一个错误:

    停止运行此脚本? 此页上的脚本导致web浏览器运行缓慢。如果它继续运行,您的计算机可能会失去响应。

    Internet Explorer中的Javascript对象有大小限制吗?有没有别的解决办法,但不能分割对象?

    4 回复  |  直到 15 年前
        1
  •  3
  •   John Fisher    15 年前

    你收到的信息的关键是“慢跑”部分,它与时间有关。因此,您的问题不是对象大小,而是构建对象所需的时间。

    为了进一步细化事物,问题也不是构造对象所花费的时间。相反,IE统计它执行的javascript语句的数量,当它执行事件处理程序或setTimeout函数时重置这个计数。

    因此,您可以通过将代码拆分为多个片段来防止这个问题,这些片段在setTimeout(…)调用内部运行;

    下面是一个可能会把你推向正确方向的例子:

    var finish = function(data) {
        // Do something with the data after it's been created
    };
    
    var data = [];
    var index = 0;
    
    var loop;
    loop = function() {
      if (++index < 1000000) {
        data[index] = index;
        setTimeout(loop, 0);
      } else {
        setTimeout(function(){ finish(data); }, 0);
      }
    }
    
    setTimeout(loop, 0);
    
        2
  •  2
  •   Daniel Vassallo    15 年前

    似乎您的脚本在创建该对象时占用了太多的处理时间,而“停止脚本”机制正在启动以避免浏览器挂起。

    之所以在internetexplorer而不是Firefox上发生这种情况,可能是因为Firefox中的JavaScript引擎效率更高,因此不会超过触发“停止脚本”的阈值。

        3
  •  2
  •   fmsf    15 年前

    这不是因为循环的大小,而是因为执行的循环数量多,执行时间长。如果你把它切成小块,它应该可以工作。

    编辑:

    你不能在服务器端进行计算吗?如果这只是初始化对象,那么可以缓存它以避免重新处理,只需将生成的json发送到javascript端。

    它看起来确实很好笑

        4
  •  2
  •   Steve Harrison    15 年前