当前位置:  开发笔记 > 编程语言 > 正文

是什么导致错误"无法从释放的脚本执行代码"

如何解决《是什么导致错误"无法从释放的脚本执行代码"》经验,为你挑选了6个好方法。

我以为我之前找到了解决方案(参见我的博客):

如果你得到JavaScript(或者应该是JScript)错误"无法从释放的脚本中执行代码" - 尝试移动头部中的任何元标记,使它们位于脚本标记之前.

...但基于最新的博客评论之一,我建议的修复可能不适用于所有人.我认为这对开放StackOverflow社区来说是一个很好的....

是什么导致错误"无法从释放的脚本执行代码"以及解决方案/解决方法是什么?



1> Sjoerd Vissc..:

当您调用在不再存在的窗口或框架中创建的函数时,会出现此错误.

如果您事先不知道窗口是否仍然存在,您可以尝试使用try/catch来检测它:

try
{
  f();
}
catch(e)
{
  if (e.number == -2146823277)
    // f is no longer available
    ...
}


谢谢Sjoerd ..但是为什么这只会在IE中发生?
我在一个数组上使用AngularJS遇到了这个问题,我转移到$ rootScope,所以我知道我可以访问该数组.但是,最初设置我的值的数组我再也无法访问了.使用[angular.copy](https://docs.angularjs.org/api/ng/function/angular.copy)在我的变量中为我提供了一个新的数组实例,而不是指向我可以使用的旧变量不能访问.
我会使用“ 0x800a1393”而不是十进制整数“ -2146823277”,因为对十六进制值进行谷歌搜索会返回更多结果。另外,是否有可能在给定的示例中检查函数`f`,以查找其声明上下文以进行记录?

2> 小智..:

处理脚本的"父"窗口(即:关闭)时会引发错误,但会调用对仍保留的脚本(例如在另一个窗口中)的引用.即使'对象'仍然存在,它想要执行的上下文也不是.

它有点脏,但它适用于我的Windows边栏小工具:

这是一般的想法:'main'窗口设置了一个函数,它将评估一些代码,是的,这是丑陋的.然后'child'可以调用这个"构建器函数"(它绑定到主窗口的范围/)并返回一个也绑定到'main'窗口的函数.当然,一个明显的缺点是,"反弹"功能无法封闭在看似定义的范围内......无论如何,足够的喋喋不休:

这是部分伪代码,但我在Windows边栏小工具上使用它的一个变体(我一直这么说,因为边栏小工具在"无限制区域0"中运行,这可能 - 或者可能不会 - 大大改变方案.)

// This has to be setup from the main window, not a child/etc!
mainWindow.functionBuilder = function (func, args) {
  // trim the name, if any
  var funcStr = ("" + func).replace(/^function\s+[^\s(]+\s*\(/, "function (")
  try {
    var rebuilt
    eval("rebuilt = (" + funcStr + ")")
    return rebuilt(args)
  } catch (e) {
    alert("oops! " + e.message)
  }
}

// then in the child, as an example
// as stated above, even though function (args) looks like it's 
// a closure in the child scope, IT IS NOT. There you go :)
var x = {blerg: 2}
functionInMainWindowContenxt = mainWindow.functionBuilder(function (args) {
  // in here args is in the bound scope -- have at the child objects! :-/
  function fn (blah) {
    return blah * args.blerg
  }
  return fn
}, x)

x.blerg = 7
functionInMainWindowContext(6) // -> 42 if I did my math right

作为变体,主窗口应该能够将functionBuilder函数传递给子窗口 - 只要在主窗口上下文中定义了functionBuilder函数!

我觉得我用了太多的话.因人而异.



3> aaron..:

这是一个非常具体的案例,我已经看到了这种行为.它在IE6和IE7中可以重现.

在iframe中:

window.parent.mySpecialHandler = function() { ...work... }

然后,在使用新内容重新加载iframe后,在包含iframe的窗口中:

window.mySpecialHandler();

此调用因"无法从释放的脚本执行代码"而失败,因为mySpecialHandler是在不再退出的上下文(iframe的原始DOM)中定义的.(重新加载iframe会破坏此上下文.)

但是,您可以在父窗口中安全地设置"可序列化"值(基元,不直接引用函数的对象图).如果你真的需要一个单独的窗口(在我的情况下,iframe)来为远程窗口指定一些工作,你可以将工作作为String传递并在接收器中"eval"它.小心这一点,它通常不会实现干净或安全的实施.



4> Grzegorz Ciw..:

如果您尝试访问JS对象,最简单的方法是创建副本:

var objectCopy = JSON.parse(JSON.stringify(object));

希望它会有所帮助.



5> pcorcoran..:

当子窗口尝试与不再打开的父窗口进行通信时,MSIE中可能会发生此错误。

(不完全是世界上最有用的错误消息文本。)


反之亦然(父母对孩子)

6> 小智..:

从IE9开始,当我们在另一个Object中的一个Array中存储的Date对象上调用.getTime()时,我们开始收到此错误.解决方案是在调用Date方法之前确保它是一个Date:

失败: rowTime = wl.rowData[a][12].getTime()

通过: rowTime = new Date(wl.rowData[a][12]).getTime()


是.IE9将破坏类型.您也可以使用数组获取它.如果需要,可以执行Array.prototype.slice.call(data).有时它会抛出这个错误,有时它会抛出E_UKNOWN ...它通常是由一个虚假的"删除"不正确地调用引起的,不幸的是与子/父问题无关; 这是浏览器坚持不懈的东西,给你一个红鲱鱼.
推荐阅读
个性2402852463
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有