【问题标题】:My JavaScript Object is too big我的 JavaScript 对象太大
【发布时间】:2010-04-22 16:23:47
【问题描述】:

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

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

Internet Explorer 中的 Javascript 对象是否有大小限制?除了不分割对象还有其他解决方案吗?

【问题讨论】:

  • 这在很大程度上取决于浏览器的内存管理和用户 PC 上的可用内存量。这是一个什么样的物体?为什么它首先那么大?在运行时你真的需要它的所有数据吗?它包含什么?
  • @Kubi 请删除其中一个重复的问题,我假设您错误地创建了它们,因为它们似乎相同?
  • 她是这么说的。
  • 对不起,我没有看到副本。这是错的! @Pekka 这是我从我的团队成员那里得到的。首先,我想检查一下是否可以这样解决。

标签: javascript


【解决方案1】:

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

为了进一步完善事物,问题也不在于构造对象所花费的时间。相反,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);

【讨论】:

  • @Kubi:你的代码应该很容易转换。如果您在尝试后需要帮助,请将其发布在 SO 上,看看您会得到什么。
  • 我想我无法理解。如果 allPlans.length 大于 1000,我尝试将 setTimeout 放在 allPlans.push 之前。
  • 在我的示例中,您需要将“while (index < dizi.length - 1) {”循环的内容放入“loop = function() {”中。与我有关的部分是您如何处理返回的结果。如果某些东西实际上使用了返回的结果,那么您需要将该代码放在类似“finish”函数的东西中。
  • 返回的结果是我想用作全局对象的对象。我想在页面加载中初始化并在整个页面生命周期中使用它。我所做的是按照您所说的将循环的内容添加到 var loop = 函数中,但是在处理与返回对象相关的其他函数时出现了其他错误。
  • @Kubi:您需要从“finish”方法调用下一个函数,而不是返回结果。 setTimeout() 旨在在当前函数的控制之外进行工作(在当前函数及其调用者完成工作之后)。因此,在我的示例中,任何取决于此代码结果的函数都需要从“完成”函数触发。
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

    这不是因为大小,而是因为您正在执行的循环数量和执行时间很长。如果你把它切成更小的部分,它应该可以工作。

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

    编辑:

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

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

    看起来确实可以缓存

    【讨论】:

    • 很抱歉,这里发布太复杂了。但基本上它是一个包含 700 个对象的对象数组。这些对象包含 4 个属性,其中一个包含多达 6 个其他类型的属性。
    • 不,我们不想在服务器端制作它!生成的 json 变成 10mbs 左右。
    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 2014-03-17
      • 2017-09-05
      • 1970-01-01
      • 2021-05-04
      • 2015-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-16
      相关资源
      最近更新 更多