我循环遍历数据数组,每次都更新一个名为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
};
};
答案 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);