深层复制以避免“无法从已释放的脚本执行代码”?

时间:2014-01-14 19:33:27

标签: javascript jquery internet-explorer-8

我有一个位于框架集内的页面(不能更改)。第1帧中的主页面调用第2帧中的数据加载页面。第2帧中的页面将wddx对象作为函数参数传回。这是一个非常简单的例子:

第2帧:

parent.content.newRoutes(newRouteList);

第1帧(名为“内容”):

function newRoutes(newRoutesContainerRouteRS) {
    routesContainer.route_rs.appendRecordSet(newRoutesContainerRouteRS, false);
}

这很好用。但是,稍后我将新页面加载到第2帧以进行服务器端验证。这样做之后,下次我尝试使用routesContainer对象做任何事情时,我在IE8中得到以下错误:

Can't execute code from a freed script

我明白为什么会这样。第2帧中的原始页面已被卸载,因此对其中的对象或函数的任何引用都不再有效。我假设我可以通过将对象的深层副本传回到第1帧来轻松解决此问题,如下所示:

function newRoutes(newRoutesContainerRouteRS) {
    // Deep copy
    copiedContainer = jQuery.extend(true, {}, newRoutesContainerRouteRS);

    routesContainer.route_rs.appendRecordSet(copiedContainer, false);
}

但是,这仍会导致相同的错误消息。为什么这种方法没有解决问题呢? jQuery.extend没有创建深层副本吗?我尝试将copiedContainer变量转换为数组,以便每次运行此函数时都不会删除前一个对象,但这没有帮助。

1 个答案:

答案 0 :(得分:1)

你看过这个问题吗?

jquery.extend(true, [], obj) not creating a deep copy

我敢打赌你的newRoutesContainerRouteRS包含复杂的对象,如上所述 - extend只适用于简单的对象