我们有这个匿名函数在我们的代码,这是jQuery的Ajax对象参数的一部分,它使用一些变量从它从调用的函数。

this.invoke = function(method, data, callback, error, bare) {
      $.ajax({
        success: function(res) {
            if (!callback) return;

            var result = "";
            if (res != null && res.length != 0)
                var result = JSON2.parse(res);

            if (bare)
            { callback(result); return; }

            for (var property in result) {
                callback(result[property]);
                break;
            }
        }
   });
}

我省略了额外的代码,但你的想法。该代码工作完全正常,但它在IE每个呼叫泄漏4个Kbs的,所以想要重构它打开匿名功能到名为一个,像this.onSuccess =函数(RES){..}

的问题是,这个函数使用变量从this.invoke(..),所以不能只把它外面它的身体。如何正确地重构这个代码,因此它的使用匿名函数与父函数的变量?

<强>更新我想创建一个单独的对象,使用相同的参数进行初始化,并通过其的onSuccess用作用于jQuery的Ajax对象的参数。虽然我怀疑它仍然会泄漏内存。

<强>更新2。我已经发现了几个链接表明实际泄漏可能的jQuery引起。 简单的jQuery Ajax调用内存泄漏Internet Explorer中 内存泄漏请求

不过这是很好的找到一个方法来重构这个。

<强>更新3。我将等待一个更通用的解决方案,在接受一个答案之前。

有帮助吗?

解决方案

您可以添加额外参数到可以在成功回调访问Ajax请求:

this.invoke = function(method, data, callback, error, bare) {
    $.ajax({
        success: onSuccess,
        invokedata: {
         callback: callback,
         bare: bare
        }
    });
};

var onSuccess = function(res) {
    var callback = this.invokedata.callback,
        bare = this.invokedata.bare;
    if (!callback) return;

    var result = "";
    if (res != null && res.length != 0)
        var result = JSON2.parse(res);

    if (bare){
        callback(result); 
        return;
    }

    for (var property in result) {
        callback(result[property]);
        break;
    }
}

其他提示

+1优秀,很好的问题 - 我觉得你的痛苦 - 这是真的很好因素,因为它是

建议之一(也许这是你的意思你更新)...定义一个包装器的onSuccess并使其返回要分配的功能。然后调用外部函数,并将其分配给“成功”选项,通过它需要的值。这些值将预先分配给内函数的变量。实际上并不知道这是否会帮助 - 你仍然结束了一个匿名函数 - 但值得一试。

this.invoke = function(method, data, callback, error, bare) {
    $.ajax({
        success: onSuccess(callback, bare);
    });
};

var onSuccess = function(callback, bare) {
     return function() {
        if (!callback) return;

        var result = "";
        if (res != null && res.length != 0)
            var result = JSON2.parse(res);

        if (bare)
        { callback(result); return; }

        for (var property in result) {
            callback(result[property]);
            break;
        }
     }
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top