javascript:作为参数传递时,设置了不正确的变量

时间:2018-11-26 04:24:07

标签: javascript node.js

我有以下代码和输出。我不明白为什么该函数接收不正确的参数。请提供指针。

var tempAccounts = [];
var i;
for (i = 0; i < accountIDs.length; i++) {
    var accountID = accountIDs[i];
    console.log("Log1:" + accountID);
    tempAccounts.push(function(callback){createTempAccount(accountID, callback)})
}

async.parallel(tempAccounts, function (error, results) {
    if (error) {
        sendError(error, "error creating temp acounts", res, logTag);
    } else {
        res.set('Content-Type','application/json');
        res.send(200, {});
    }
});


function createTempAccount(accountID, callback)
{
  console.log("Log2:" + accountID);
  ...
}

输出:

Log1: 1234
Log1: abcd

Log2: 1234
Log2: 1234

这里可能是什么问题?

1 个答案:

答案 0 :(得分:1)

您不需要所有其他代码即可看到问题。可以将其简化为以下代码段。在循环中定义函数时,将在闭包中捕获一个共享变量。然后,当您调用这些函数时,只会得到一个值:

var tempAccounts = [];
let accountIDs = [200, 400]
var i
for ( i = 0; i < accountIDs.length; i++) {
    var accountID = accountIDs[i];
    console.log("Log1:" + accountID);
    tempAccounts.push(function(){return accountID})
}
// all the same value
console.log(tempAccounts.map(i => i()))

最简单的方法是在循环的每次迭代中使用let定义一个新变量:

var tempAccounts = [];
let accountIDs = [200, 400]
for (let i = 0; i < accountIDs.length; i++) {
    let accountID = accountIDs[i];
    console.log("Log1:" + accountID);
    tempAccounts.push(function(){return accountID})
}

// now you get the unqie values:
console.log(tempAccounts.map(i => i()))