将闭包传递给Jquery $ .each

时间:2013-08-30 13:17:19

标签: javascript jquery closures

我有函数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());
}

当我这样做时,我得到以下错误:“未捕获的TypeError:无法调用未定义的方法'调用'”。 我知道thislist.push($(this).text());的对象func必须更改为其他内容,但我不知道是什么。我怎样才能做到这一点?

3 个答案:

答案 0 :(得分:5)

您正在立即调用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());
}

答案 1 :(得分:2)

你需要像

这样的东西
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());
}

答案 2 :(得分:0)

试试这个......

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);
        });
}