将闭包传递给Jquery $ .each

loc*_*cto 2 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);
    });
}
Run Code Online (Sandbox Code Playgroud)

但是,我想通过这样做使函数显示更通用

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());
}
Run Code Online (Sandbox Code Playgroud)

当我这样做时,我得到以下错误:"未捕获的TypeError:无法调用未定义的方法'调用'".我知道对象thislist.push($(this).text());func已改为别的东西,但我不知道是什么.我怎样才能做到这一点?

Pau*_*aul 5

你正在func1(list)立即调用然后传递它的返回值(undefined因为它没有返回语句)$.each.

$.each(items, func1(list));
Run Code Online (Sandbox Code Playgroud)

相当于:

var result = func1(list); // Will be undefined
$.each(items, result);
Run Code Online (Sandbox Code Playgroud)

您可以使用此代替:

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());
}
Run Code Online (Sandbox Code Playgroud)

  • @ user971602:`$ .each(items,func1(list))`*调用*`func1(list)`并将其返回值传递给`$ .each`,就像`foo(bar())`*调用的方式一样*`bar()`然后将其返回值传递给`foo`.`$ .each`(和`setTimeout`,`setInterval`和事件处理程序连接方法 - 人们遇到的其他地方)的参数如何由JavaScript引擎处理以及参数如何处理之间没有神奇的区别处理任何其他功能. (2认同)