如果你曾经遇到过JavaScript(或者说是JScript)错误“无法从已释放的脚本中执行代码”,请尝试将head标签中的任何meta标签移到script标签之前。
但是根据最近的一条博客评论,我建议的修复方法可能并不适用于所有人。我认为这是一个向StackOverflow社区开放的好问题...
是什么导致了错误“无法从已释放的脚本中执行代码”,有哪些解决方案或变通方法?
如果你曾经遇到过JavaScript(或者说是JScript)错误“无法从已释放的脚本中执行代码”,请尝试将head标签中的任何meta标签移到script标签之前。
但是根据最近的一条博客评论,我建议的修复方法可能并不适用于所有人。我认为这是一个向StackOverflow社区开放的好问题...
是什么导致了错误“无法从已释放的脚本中执行代码”,有哪些解决方案或变通方法?
当您调用在已不存在的窗口或框架中创建的函数时,会出现此错误。
如果您事先不知道窗口是否仍存在,可以使用try/catch检测它:
try
{
f();
}
catch(e)
{
if (e.number == -2146823277)
// f is no longer available
...
}
当脚本的“父”窗口被处理(即关闭),但仍在另一个窗口中保持对脚本的引用时调用,则会导致错误。即使该“对象”仍然存在,它想要执行的上下文也不存在。
这有点不好看,但对于我的Windows侧边栏小工具有效:
这是一般想法: “主”窗口设置一个将评估某些代码的函数,是的,它很丑。 然后,“子”可以调用此“构建器函数”(它绑定到主窗口的作用域/)并返回一个也绑定到“主”窗口的函数。显而易见的缺点是,被“重新绑定”的函数不能闭合其表面上定义的作用域...无论如何,够了废话:
这部分是伪代码,但我在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
obj.hasOwnProperty()
。 - jandersen如果你想访问JS对象,最简单的方法是创建一个副本:
var objectCopy = JSON.parse(JSON.stringify(object));
希望这能有所帮助。
这里有一个非常具体的情况,我在IE6和IE7中看到了这种行为,且可以重现。
在一个iframe内部:
window.parent.mySpecialHandler = function() { ...work... }
window.mySpecialHandler();
在IE9中,当调用存储在另一个对象内部数组中的Date对象上的.getTime()方法时,我们开始收到此错误。解决方案是在调用Date方法之前确保它是一个Date对象:
失败:rowTime = wl.rowData[a][12].getTime()
成功:rowTime = new Date(wl.rowData[a][12]).getTime()
当我在子框架内向顶层窗口添加引用类型,并在子窗口重新加载后尝试访问它时,我遇到了这个问题。
例如:
// set the value on first load
window.top.timestamp = new Date();
// after frame reloads, try to access the value
if(window.top.timestamp) // <--- Raises exception
...
// set the value on first load
window.top.timestamp = Number(new Date());
这并不是一个答案,而是一个例子,说明了这种情况的具体发生位置。
我们有框架A和框架B(这不是我的想法,但我必须接受它)。框架A永远不会改变,框架B经常变化。我们无法直接将代码更改应用于框架A,因此(根据供应商的说明)我们只能在框架B中运行JavaScript - 正在不断变化的确切框架。
我们有一段需要每5秒运行一次的JavaScript代码,因此框架B中的JavaScript创建了一个新的脚本标记,并将其插入到框架B的头部部分。setInterval存在于这个新脚本中(被注入的脚本),以及要调用的函数。即使被注入的JavaScript技术上是由框架A加载的(因为它现在包含脚本标记),一旦框架B发生变化,该函数就不再可由setInterval访问。
之前的回答中解释得非常相关。我只是想提供我的情况,希望这能帮助其他人。
我们曾经使用:
<script> window.document.writeln(table) </script>
在脚本中使用onchange
事件调用其他函数,但是在IE中,使用writeln会完全覆盖HTML,而在Chrome中则有不同的行为。
我们将其更改为:
<script> window.document.body.innerHTML = table;</script>
因此保留了修复问题的脚本。
更新iframe的src时,我得到了这个错误。
通过像这样访问主窗口中元素的事件(例如我的点击事件),直接调用主/最外层窗口,导致了该错误:
top.$("#settings").on("click",function(){
$("#settings_modal").modal("show");
});
我刚刚像这样更改了它,现在它可以正常工作(调用 iframe 窗口的父元素的父元素):
$('#settings', window.parent.parent.document).on("click",function(){
$("#settings_modal").modal("show");
});
我的包含模态框的 iframe 也在另一个 iframe 中。
JSON.parse(JSON.stringify(whatever))
的副本(而不是 angular.copy)来解决了这个问题。它只影响 ie11。 - Harry Pehkonen0x800a1393
而不是十进制整数-2146823277
,因为在Google中搜索十六进制值会返回更多结果。此外,在您给出的示例中,是否有可能检查函数f
以查找其声明上下文,以记录日志? - mbomb007