我在 CodeSchool 上做了一些研究。在观看教程时,我对一个示例感到困惑。他们在视频中试图解释的是,在循环中创建的闭包要到最后一刻才会绑定(bind)。此代码的目的是在数组中对其进行名称检查,并单独返回名称及其位置(没有零约定)。由于闭包直到最后一刻才绑定(bind),因此此代码返回 z 5
.我很困惑为什么这段代码返回的是 5 而不是 4。我的数组长度是 4,for 循环在 4 之前停止,因为 i < passengerArray.length
相当于i < 4
因此最后检查的索引应该是 passengerArray[3]
这意味着我的 (i+1)
最后应该是 4 而不是 5。我希望这是有道理的。这件事困扰了我一整天。
function assignTorpedo(name, passengerArray)
{var torpedoassignment;
for(var i = 0; i < passengerArray.length; i++){
if(passengerArray[i] == name){
torpedoAssignment = function(){
console.log(name + " " + (i+1));
};
}
}
return torpedoAssignment;
}
var give = assignTorpedo("z",["z","a","b","c"]);
give();
最佳答案
当测试条件失败时,for
循环结束。为什么会失败?因为 i
不小于 4;它等于 4。因此,在 console.log()
输出中您会看到 5。
还有声明
closures created in loops won't bind until the last minute.
是一种描述事物运作方式的奇怪方式。一旦在数组中找到该名称,就会为该变量分配一个对构造函数的引用。当 assignTorpedo
返回该值时,闭包就存在了。在闭包中,变量“i”的值已经是 4。
关于javascript - 来自 CoderSchool 的 JavaScript 中的闭包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26579045/