如何处理JavaScript范围

时间:2017-01-04 12:05:24

标签: javascript scope callback

我有一个简单的javascript循环和一个带回调的函数,我在添加

console.log(accounts);  // logs this: ["123", "456"]
for (var i = 0; i < accounts.length; i++) {
  var currentAccount = accounts[i];
  console.log(currentAccount);  // first logs "123" and then "456" as expected

  meta.getBalance.call(account, {from: currentAccount}).then(function(value) {
    console.log(currentAccount);  // logs "456" twice
    console.log(value.value());  // logs the same value corresponding to "123" twice
  });
}

我认为它记录了&#34; 456&#34;在回调中两次,因为它是异步调用或其他东西。但我不确定如何解决这个问题。

有什么想法吗?

[编辑]

我又添加了一个console.log,它记录了回调返回的值。令我惊讶的是,两次记录相同的值,相当于123,而不是456.为什么为什么?!神仙的名字怎么样?!

4 个答案:

答案 0 :(得分:3)

您可以使用closure

function cbGenerator(account) {
  return function(value) {
    console.log(account);
  }
}

...后来

for (var i = 0; i < accounts.length; i++) {
  var currentAccount = accounts[i];
  console.log(currentAccount);  
  var cb = cbGenerator(currentAccount);
  meta.getBalance.call(account, {from: currentAccount}).then(cb);
}

答案 1 :(得分:0)

在IIFE中调用您的功能

console.log(accounts);  // logs this: ["123", "456"]
for (var i = 0; i < accounts.length; i++) {
  var currentAccount = accounts[i];
  console.log(currentAccount);  // first logs "123" and then "456" as expected

  (function(currentAccount){
         meta.getBalance.call(account, {from:currentAccount}).then(function(value) {
    console.log(currentAccount);  
          });    
  })(currentAccount);
  
}

答案 2 :(得分:0)

您可以将当前值传递给函数,该函数返回一个被调用的函数并可以访问您的值。多数民众赞成Closures

&#13;
&#13;
var accounts = ["123", "456"];
for (var i = 0; i < accounts.length; i++) {
  var currentAccount = accounts[i];
  console.log(currentAccount);  // first logs "123" and then "456" as expected

  promise('account', {from: currentAccount}).then(currentAccount => res => {
        console.log(currentAccount) // 123, then 456
  });
}

function promise() {
  return new Promise((res, rej) => res());
}
&#13;
&#13;
&#13;

答案 3 :(得分:0)

在回调中,您记录currentAccount变量,该变量来自外部作用域并在for循环中分配。

最有可能的是,当您的异步调用从第一次调用返回时(当currentAccount为&#34; 123&#34;时),currentAccount已经获取了第二个数组元素的值&#34; 456&#34;在for循环中。

您是否可以尝试记录传递给回调的value参数?您应该看到返回2个不同的值,一个用于帐户&#34; 123&#34;和另一个帐户&#34; 456&#34;。