函数内部变量值不正确

时间:2013-06-18 00:55:05

标签: javascript

我无法在“Success”函数中访问变量“k”的值,但在它之外,它显示正确的值,并且数组的内容也没有保留在同一个函数中。

日志中k的值总是等于nArray.length,这是我的FOR循环的条件。

这是Parse.com云代码的问题,还是我的代码有问题?

感谢阅读。

nArray = gameScore.get("myArray");
var query2 = new Parse.Query("User");    
for (var k=1; k < nArray.length; k++) {
  query2.equalTo("username", nArray[k]);
  query2.find({
    success: function(results) {
      if (results.length !== 0) {
        **alert("The value of k is" + k);** //the value of k here always is equal to the total # of loops
        var object = results[0];
        alert(object.id + ' - ' + object.get('email'));
        var ema = object.get('email');
        mArray.push(ema);
        alert("Matched Contacts:" + mArray.length);
      }
    },
    error: function() {
      response.error("movie lookup failed");
    }
  });
  alert(mArray.join('\n'));
  alert("The value of k at bottom is correct" + k);
};

1 个答案:

答案 0 :(得分:2)

问题是find在循环结束时获得k,因此k具有最后一次迭代的值。你可以使用像这样的闭包

nArray = gameScore.get("myArray");
var query2 = new Parse.Query("User");

for (var k=1; k < nArray.length; k++)
{
    (function(k){ // <-- define an inline function
        query2.equalTo("username", nArray[k]);
        query2.find({
            success: function(results) {

                if (results.length !== 0)
                {
                      alert("The value of k is" + k);
                      var object = results[0];
                      alert(object.id + ' - ' + object.get('email'));
                      var ema = object.get('email');
                      mArray.push(ema);
                      alert("Matched Contacts:" + mArray.length);

                }
            },
            error: function() {
              response.error("movie lookup failed");
            }
        });
    })(k); // <-- call it after definition using (k)
    alert(mArray.join('\n'));
    alert("The value of k at bottom is correct" + k);
};

我假设find的参数是异步执行的回调,否则我无法解释你报告的行为。

如果是这种情况,请考虑mArray.join('\n')无法按预期工作。