javascript - 如何重构这个 Javascript 匿名函数?

标签 javascript jquery

我们的代码中有这个匿名函数,它是 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 = function(res) { .. }。

问题是这个函数使用了 this.invoke(..) 中的变量,所以我不能把它带到函数体之外。如何正确重构此代码,使其使用匿名函数和父函数变量?

更新。 我正在考虑创建一个单独的对象,使用相同的参数对其进行初始化,然后将其 onSuccess 函数作为参数传递给 jQuery 的 Ajax 对象。虽然我怀疑它仍然会泄漏内存。

更新 2. 我发现一些链接表明实际泄漏可能是由 jQuery 引起的。 Simple jQuery Ajax call leaks memory in Internet Explorer Memory leak involving jQuery Ajax requests

找到重构它的方法仍然是件好事。

更新 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;
    }
}

关于javascript - 如何重构这个 Javascript 匿名函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2542208/

相关文章:

javascript - 当焦点不在或在 div 外部单击时隐藏 div

javascript - jQuery 焦点不适用于所选插件

jquery - 如何使用 jQuery 获取所选文本的字符长度?

javascript - 是否可以在同一对象中引用对象?

javascript - 有没有一种方法可以以编程方式修复 javascript 中的 JSON 语法错误?

javascript - 使用或不使用 string.slice 对字符串中的字符进行计数

javascript - 如果选择下拉列表中的特定值,GAE任务队列将不会继续

c# - Javascript var 作为 c# mvc3 razor 中的参数

jquery - <select> 只显示所选选项的第一个字符

javascript - 在 View 中将 .Net 对象转换为 JSON 对象