javascript - 最后两行代码看不懂
问题描述
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]
我不明白为什么这支军队要调用两次,为什么我们需要调用它来输出?
解决方案
军队是一系列的封闭。每个闭包打印变量的内容i
。但是在您执行闭包时(例如,在调用时army[5]()
),while 循环确实已经完成,因此i
将始终为 10。也就是说,因为i
是使用var关键字声明的,因此范围i
是makeArmy()
函数。这就是为什么army[0]()
两者army[5]()
都打印 10。
下面的代码就是您的目标: Nowi
被传递到一个let变量x
中,因为使用 let 关键字而不是 var,所以x
now 的范围是针对特定 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
}
可以在此处找到更多详细信息、说明和简单示例。
推荐阅读
- vb.net - 在 VB.Net 中返回空引用
- ios - 条件和 UIButton
- python - 创建新用户 Google admin sdk python
- css - 清除缓存后没有更新css文件
- css - 使图像在悬停时依次变换
- numpy - 在 TensorFlow Graph 中使用 scipy.stats.entropy
- performance - Haskell中的Eratosthenes执行时间筛
- php - Prestashop 1.6.1.15 - 覆盖控制器问题
- google-sheets - Google 表格:Arrayformula 以相反的顺序生成日期
- sql - 根据条件查找既存在又不存在的值(SQL Server)