在javascript中绕过回调变量

在javascript中绕过回调变量,javascript,Javascript,我对Javascript的理解是,变量有函数作用域,而不是块作用域,因此块内声明的变量被提升到块上方的函数。这将给出以下代码示例: var arr = [1, 2, 3, 4] for(var i = 0; i < arr.length; i++) { var entry = arr[i]; setTimeout(function() { console.log(entry); }, 100); } 我的问题是,如果我希望每次调用setTimeout都从arr记

我对Javascript的理解是,变量有函数作用域,而不是块作用域,因此块内声明的变量被提升到块上方的函数。这将给出以下代码示例:

var arr = [1, 2, 3, 4]  
for(var i = 0; i < arr.length; i++) { 
  var entry = arr[i];
  setTimeout(function() {
    console.log(entry);
  }, 100);
}

我的问题是,如果我希望每次调用
setTimeout
都从
arr
记录不同的值,我应该如何重写代码?

您可以将
setTimeout
更改为:

setTimeout(
   (function()
      {
          var entry = arr[i];
          return function() {console.log(entry);}
      }
   )()
);
这样,您就创建了一个新的作用域,
entry
就在该作用域中

您还可以执行以下操作:

(function(e)
    {
        setTimeout(function(){console.log(e);});
    }
)(entry);
这也创建了一个新的作用域,
e
位于其中

还有一个选择:

setTimeout(
    (function(e)
        {
            return function() {console.log(e);};
        }
    )(entry);
);
在所有情况下,您都使用一个立即调用的匿名函数,因此唯一的副作用是您正在创建一个新的作用域


(编辑:为了可读性重新格式化了一点,并添加了更多的解释)

您可以将
设置超时更改为:

setTimeout(
   (function()
      {
          var entry = arr[i];
          return function() {console.log(entry);}
      }
   )()
);
这样,您就创建了一个新的作用域,
entry
就在该作用域中

您还可以执行以下操作:

(function(e)
    {
        setTimeout(function(){console.log(e);});
    }
)(entry);
这也创建了一个新的作用域,
e
位于其中

还有一个选择:

setTimeout(
    (function(e)
        {
            return function() {console.log(e);};
        }
    )(entry);
);
在所有情况下,您都使用一个立即调用的匿名函数,因此唯一的副作用是您正在创建一个新的作用域


(编辑:为了可读性重新格式化了一点,并添加了更多的解释)

您已经可以在
arr
中记录每个值了我已经澄清了我的问题,我不想简单地
for(){console.log(arr[I])
也可以在
arr
中记录每个值了我已经澄清了我的问题,我不想简单地
for(){console.log(arr[I])}
也是