循环中的闭包/回调

Closure/callback in for loop

本文关键字:回调 闭包 循环      更新时间:2023-09-26

可能重复:
Javascript循环中的事件处理程序-需要闭包吗?

一段时间以来,我一直在努力让它发挥作用,并决定提出要求。

我有以下内容:

function doSomething(var1, var2) {
    dojo.xhrGet({
        url:"somUrl",
        content: {value1:var1,value2:var2},
        preventCache: true,
        handleAs:"json",
        load: function(response){
            for(var i in response.myObject) {
                var listItem = new dojox.mobile.ListItem({
                    label: response.myObject[i].name,
                    rightText: response.myObject[i].value,
                    clickable: true, 
                    onClick: function() {
                        customFunction(response.myObject[i]);
                        this.transitionTo("someScreen");
                    }   
                });
                myList.addChild(listItem);
            }               
        },
        error:function(e){alert(e);}
    });
}
doSomething(myVal1, myVal2);

表示customFunction(response.myObject[i]);的行总是返回myObject arrray中的最后一个对象。

有人能帮我学习语法吗?这样我就可以正确地使用它了?我一直在读关于js闭包和回调的文章,但我就是无法让它发挥作用。

感谢

您需要一个额外的包装器函数

onClick: (function(obj) {
    return function() {
        customFunction(obj);
        this.transitionTo("someScreen");
    };
})(response.myObject[i])

请参阅此答案以获得解释:

JavaScript的作用域是函数级,而不是块级,并且创建闭包只是意味着封闭作用域被添加到封闭功能的词汇环境。

循环终止后,函数级变量i具有值5[注意:或者,在这种情况下,是response.myObject]中最后一个属性的名称,这就是内部函数"看到的"。

您需要确保在for循环的每次迭代中,i都包含在闭包中:

[...]
  load: function(response){
        for(var i in response.myObject) {
            var listItem = new dojox.mobile.ListItem({
                label: response.myObject[i].name,
                rightText: response.myObject[i].value,
                clickable: true, 
                onClick: (function(inner) {
                    return function (clickEvent) {
                      customFunction(response.myObject[inner]);
                      this.transitionTo("someScreen");
                    }
                }(i))   
            });
            myList.addChild(listItem);
        }               
    }
 [...]