我正在学习闭包。这个例子是在闭包时犯的一个常见错误:
function assignTorpedo(name, passengerArray) {
var torpedoAssignment;
for (var i = 0; i<passengerArray.length; i++) {
if (passengerArray[i] == name) {
torpedoAssignment = function() {
alert("Ahoy, " + name + "!\n" +
"Man your post at Torpedo #" + (i+1) + "!");
};
}
}
return torpedoAssignment;
}
由于 for 循环在闭包返回之前完成,因此 i 值将与名称不匹配。因此,我知道循环在返回发生之前继续进行。
我的问题来自于此,这是正确做事方法的示例:
function makeTorpedoAssigner(passengerArray) {
return function (name) {
for (var i = 0; i<passengerArray.length; i++) {
if (passengerArray[i] == name) {
alert("Ahoy, " + name + "!\n" +
"Man your post at Torpedo #" + (i+1) + "!");
}
}
};
}
我不明白为什么在上面的例子中,for循环在第一次找到匹配时不会继续下去,这会导致另一个不匹配的i。我知道 return 会停止一个函数,但我不明白 return 和第一个匹配之间的联系,因为它们不会同时发生(视觉上)。我了解代码如何知道如果该返回位于 if 函数或 for 循环内则停止。
最佳答案
I don't understand why in the above example the for loop wouldn't also continue past the first time it finds a match
会的。
which would result in another mismatched i.
不会,因为它每次都会检查if (passengerArray[i] == name)
。但这很浪费;这是一个不寻常的修复。更好的方法是传递索引:
function makeTorpedoAssigner(passengerArray, i) {
return function (name) {
alert("Ahoy, " + name + "!\n" +
"Man your post at Torpedo #" + (i+1) + "!");
};
}
function assignTorpedo(name, passengerArray) {
for (var i = 0; i<passengerArray.length; i++) {
if (passengerArray[i] == name) {
return makeTorpedoAssigner(passengerArray, i);
}
}
}
关于javascript - 了解闭包中的变量错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32918587/