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引擎处理,以及如何处理任何其他函数的参数。@user971602func1(列表)
使用参数list
调用func1
,就像您期望的那样。查找func1(列表)
在你的代码中,我想你会理解我的意思。你在$之前调用它。每个都会被调用,因为在Javascript中,函数的参数在调用函数之前都会被计算。@T.J.Crowder和Paulpro谢谢大家,我很困惑,因为我认为作为第二个参数传递给每个函数的函数都会被调用在每个函数体中使用,以执行所需的操作。@user971602:是的,但您必须实际传入函数,而不是调用函数并传入其返回值。:-(当您在函数引用后调用它时,(…)
)不应list.push($(this).text())代码>可以更改为类似于list.push($(value.text())代码>好的对不起,现在我明白了。您将此
作为参数传递。