我的JavaScript对象太大了

时间:2010-04-22 16:23:48

标签: javascript

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

  

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

Internet Explorer中的Javascript对象是否有任何大小限制?任何其他解决方案,但没有划分对象?

4 个答案:

答案 0 :(得分:3)

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

为了进一步改进,问题不是构建对象所花费的时间。相反,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);

答案 1 :(得分:2)

这不是因为大小,而是因为你正在执行大量的循环和大的执行时间。如果你将它切成较小的部分它应该可以正常工作。

尝试降低运行功能的复杂性。您可以发布它,以便我们可以查看循环并尝试提供帮助吗?

编辑:

我希望你出于某种原因想要在客户端做所有这些。代码似乎需要在客户端执行大量执行。

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

它似乎可以缓存

答案 2 :(得分:2)

您必须在代码中使用大循环或一些递归逻辑。它实际上并不依赖于对象的大小 - 它取决于它使用的CPU资源(内存,处理器等)。

答案 3 :(得分:2)

JavaScript可用的资源受客户端计算机上资源的限制。

在创建该对象时,您的脚本似乎使用了太多的处理时间,并且“停止脚本”机制正在启动以保持您的浏览器不会挂起。

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