向Jquery$.each传递一个闭包

Passing a closure to Jquery $.each

本文关键字:一个 闭包 Jquery each      更新时间:2023-09-26

我有一个函数requestXML,它进行异步调用以获取xml文件

我也有这个实现,工作良好

function show(url){
    requestXML(url, function(xml){
        var items = $(xml).find('item');
        var list = new Array();
        $.each(items, function(){
            list.push($(this).text());
        });
        displayList(list);
    });
}

然而,我想通过执行使show函数更通用

function show(url, func1){
    requestXML(url, function(xml){
        var items = $(xml).find('item');
        var list = new Array();
        $.each(items, func1(list));
        displayList(list);
    });
}
var func1 = function(list){
    list.push($(this).text());
}

当我这样做时,我会得到以下错误:"Uncaught TypeError:无法调用未定义的方法'call'"。我知道funclist.push($(this).text());中的对象this必须更改为其他对象,但我不知道更改为什么。我怎样才能做到这一点?

您立即调用func1(list),然后将其返回值(undefined,因为它没有返回语句)传递给$.each

$.each(items, func1(list));

相当于:

var result = func1(list); // Will be undefined
$.each(items, result);

你可以用这个代替:

function show(url, func1){
    requestXML(url, function(xml){
        var items = $(xml).find('item');
        var list = new Array();
        $.each(items, $.proxy(func1, list));
        displayList(list);
    });
}
var func1 = function(el){
    this.push($(el).text());
}

您需要类似的东西

function show(url, func1){
    requestXML(url, function(xml){
        var items = $(xml).find('item');
        var list = new Array();
        $.each(items, function(idx, value){
            func1.call(this, list, idx, value)
        });
        displayList(list);
    });
}
var func1 = function(list, idx, value){
    list.push($(this).text());
}

试试这个。。。

function show(url, func1){
    var list = [];
    var func1 = function(ele){
          list.push($(ele).text());
    }
    requestXML(url, function(xml){
        var items = $(xml).find('item');
        $.each(items, func1(ele));
        displayList(list);
        });
}