外部变量在成功回调中未正确更新

时间:2015-02-28 12:42:17

标签: javascript jquery ajax

我循环遍历数据数组,每次都更新一个名为commentBody的变量。

变量在循环内部更新,但是当我从成功回调中引用它时,它总是输出所有循环的数组的最终值。

我错过了什么?

for (var p = 0; p < data.comments.length; p++) {

    var commentBody = data.comments[p].comment;

    var authorName = "not set yet";

    getName(data.comments[p].userId).success(function(a) {

          authorName = a.username;
          setter();

    });

     console.log(commentBody); // CORRECT = DIFFERENT VALUE EACH TIME

     var setter = function() {

           console.log(commentBody); // SAME VALUE FOR ALL INTERATIONS 

      };

};

1 个答案:

答案 0 :(得分:1)

commendBody变量不是for循环的本地变量,而是每次迭代时都会更新的变量。
因此,当调用setter方法时,commentBody指的是当时的值。
考虑getName async ,所有getName成功函数在for循环结束后调用。因此,在调用setter函数时,commentBody保存for循环中的最后一个值,因此所有setter函数都打印相同的值。

这样做:

//commentBody is passed as local variable (a copy) to the function
var setter = (function(c){ console.log(c); })(commentBody);