首页 > 解决方案 > 最后两行代码看不懂

问题描述

function makeArmy () {
  let shooters = [];
  let i = 0;

  while (i < 10) {
    let shooter = function() {
    console.log(i);
  };

  shooters.push(shooter);
  i++
 }

 return shooters;
}

let army = makeArmy();
army[0]();
army[5]();

我不明白这是什么-为什么需要输出

army[0](); 
army[5]();
i know [0 and 5 are index numbers]

我不明白为什么这支军队要调用两次,为什么我们需要调用它来输出?

标签: javascript

解决方案


军队是一系列的封闭。每个闭包打印变量的内容i。但是在您执行闭包时(例如,在调用时army[5]()),while 循环确实已经完成,因此i将始终为 10。也就是说,因为i是使用var关键字声明的,因此范围imakeArmy()函数。这就是为什么army[0]()两者army[5]()都打印 10。

下面的代码就是您的目标: Nowi被传递到一个let变量x中,因为使用 let 关键字而不是 var,所以xnow 的范围是针对特定 i 次迭代而不是 makeArmy 函数的单个射手闭包。

function makeArmy () {
   var shooters = []                // <-- use var here
   var i = 0                        // <-- because they're simple variables
   while (i < 10) {
      let x = i                     // <-- use let here to make x a block-scoped local variable that is bound to the closure
      const shooter = function() {  // <-- use const here because you never change the shooter thus it's a simple constant
         console.log(x)
      }
      shooters.push(shooter)
      i++
    }
  return shooters
 }

可以在此处找到更多详细信息、说明和简单示例。


推荐阅读