我为什么会收到“无法从已释放的脚本中执行代码”的错误信息?

4

首先,是的,我已经阅读了这个答案... 而且,是的,在我的页面上没有任何 meta 标签,而且也没有超时或 ajax 请求。

我有以下辅助方法(是的,我可以制作一个原型方法...):

function removeElementFromArray(array, compareMethod) {
    if (!array) {
        return;
    }
    if (!$.isFunction(compareMethod)) {
        return;
    }
    var index = getIndexOfElement(array, compareMethod);
    if (index < 0) {
        return;
    }
    array.splice(index, 1);
}
function getIndexOfElement(array, compareMethod) {
    if (!array) {
        return -1;
    }
    if (!$.isFunction(compareMethod)) {
        return -1;
    }
    for (var i = 0; i < array.length; i++) {
        var element = array[i];
        if (compareMethod(element)) {
            return i;
        }
    }
    return -1;
}

我正在使用以下方式调用:

$foo.on('click', function () {
    removeElementFromArray(window.myArray, function (element) {
        return // some condition
    });
});

我在以下代码中遇到了异常 "SCRIPT5011: Can't execute code from a freed script" (仅在IE渲染器版本小于10时出现):

array.splice(index, 1);

这个异常不会在第一次调用时出现,但如果对同一个数组进行多次调用,则可能会出现异常...

我无法想到任何一个原因导致这种异常的发生,因为在调用堆栈中,我还在其他行访问了该数组(例如,getIndexOfElement,其中我遍历了该数组)。

有人能帮我解决这个问题吗?


2
你能在 JSFiddle 上重现这个问题吗? - Denys Séguret
你确定你的代码没有改变splice函数吗?数组是真正的数组还是类似数组的对象? - Denys Séguret
@dystroy 这是一个真正的数组,使用 new Array(); 创建,当我在检查器中悬停 splice 原型时,我得到了 native code... - user57508
1
那么你一定应该看一下这个链接 https://dev59.com/JHVD5IYBdhLWcg3wHnwX - Tommi
@Tommi:是的……我已经在iframe中交换了闭包变量的值,然后原始闭包指向了一个不存在的东西……请将您的评论添加为答案! - user57508
显示剩余3条评论
1个回答

2
这个问题包含了有关iframe关系的好答案。(根据提问者的建议添加为答案)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接