Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/392.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将闭包传递给Jquery$.each_Javascript_Jquery_Closures - Fatal编程技术网

Javascript 将闭包传递给Jquery$.each

Javascript 将闭包传递给Jquery$.each,javascript,jquery,closures,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());

我有一个函数
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);
    });
}
但是,我希望通过这样做使函数显示更通用

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());
}
当我这样做时,我得到了以下错误:“uncaughttypeerror:无法调用未定义的方法'call'。 我从
list.push($(this.text())中知道对象
this
func
中的code>更改为其他内容,但我不知道更改为什么。如何实现此功能?

您立即调用
func1(list)
,然后将其返回值(
未定义,因为它没有返回语句)传递给
$。每个

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

谢谢你的快速回答。虽然我同意这是可行的,但我不明白你说“你正在立即调用func1(list),然后将其返回值(未定义)传递给$.each。”你能更好地解释一下吗。@user971602:
$。each(items,func1(list))
调用
func1(list)
并将其返回值传递到
$。each
,完全是
foo的方式(bar())
调用
bar()
,然后将其返回值传递到
foo
中。
$的参数之间没有什么神奇的区别。每个
(和
setTimeout
,和
setInterval
,以及事件处理程序连接方法——人们遇到的其他地方)由JavaScript引擎处理,以及如何处理任何其他函数的参数。@user971602
func1(列表)
使用参数
list
调用
func1
,就像您期望的那样。查找
func1(列表)
在你的代码中,我想你会理解我的意思。你在
$之前调用它。每个
都会被调用,因为在Javascript中,函数的参数在调用函数之前都会被计算。@T.J.Crowder和Paulpro谢谢大家,我很困惑,因为我认为作为第二个参数传递给每个函数的函数都会被调用在每个函数体中使用,以执行所需的操作。@user971602:是的,但您必须实际传入函数,而不是调用函数并传入其返回值。:-(当您在函数引用后调用它时,
(…)
)不应
list.push($(this).text())可以更改为类似于
list.push($(value.text())好的对不起,现在我明白了。您将此
作为参数传递。