【问题标题】:Passing a closure to Jquery $.each将闭包传递给 Jquery $.each
【发布时间】:2013-08-30 13:17:18
【问题描述】:

我有函数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: Cannot call method 'call' of undefined”。 我知道 list.push($(this).text()); 中的 func 中的对象 this 必须更改为其他内容,但我不知道是什么。我怎样才能做到这一点?

【问题讨论】:

    标签: javascript jquery closures


    【解决方案1】:

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

    【讨论】:

    • 感谢您的快速回答。虽然我同意这行得通,但我不明白你说“你立即调用 func1(list) 然后将它的返回 (未定义) 传递给 $.each”。你能解释得更好吗?
    • @user971602: $.each(items, func1(list)) 调用 func1(list)并将其返回值传递给$.each,与foo(bar()) 调用 @的方式完全相同987654331@,然后将其返回值传递给foo。 JavaScript 引擎如何处理$.each(和setTimeout,和setInterval,以及事件处理程序连接方法——人们遇到的其他地方)的参数以及任何处理其他功能。
    • @user971602 func1(list) 使用参数list 调用func1,就像您期望的那样。在你的代码中寻找func1(list),我想你会明白我的意思。您在调用 $.each 之前调用它,因为在 Javascript 中,函数的参数都在调用函数之前被评估。
    • @T.J.Crowder 和 Paulpro 谢谢大家,我很困惑,因为我认为作为第二个参数传递给每个函数的函数将在每个函数的主体中使用以执行所需的操作。
    • @user971602:是的,但您必须实际传入函数,而不是调用函数并传入其返回值。 :-) (当您在函数引用之后有 (...) 时,您正在 调用它。)
    【解决方案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());
    }
    

    【讨论】:

    • 不应该把list.push($(this).text());改成list.push($(value).text());这样的东西????
    • 好的,抱歉,现在我明白了。您将this 作为参数传递。
    【解决方案3】:

    试试这个...

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

    【讨论】:

      猜你喜欢
      • 2016-02-27
      • 2011-06-29
      • 1970-01-01
      • 2017-07-13
      • 1970-01-01
      • 1970-01-01
      • 2012-10-19
      • 1970-01-01
      • 2019-07-05
      相关资源
      最近更新 更多