Javascript 理解闭包中的变量错误?
我正在学习闭包。此示例是在关闭时常见的错误:Javascript 理解闭包中的变量错误?,javascript,function,closures,Javascript,Function,Closures,我正在学习闭包。此示例是在关闭时常见的错误: function assignTorpedo(name, passengerArray) { var torpedoAssignment; for (var i = 0; i<passengerArray.length; i++) { if (passengerArray[i] == name) { torpedoAssignment = function() {
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;
}
功能分配鱼雷(姓名、乘客姓名){
无功功率分配;
对于(var i=0;i
我不明白为什么在上面的例子中,for循环在第一次找到匹配项后就不会继续了
会的
这将导致另一个不匹配的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);
}
}
}
函数赋值器(passengerArray,i){
返回函数(名称){
警报(“喂,”+name+“!\n”+
“在鱼雷站站岗”+(i+1)+“!”;
};
}
功能分配鱼雷(姓名、乘客姓名){
对于(var i=0;i
我不明白为什么在上面的例子中,for循环在第一次找到匹配项后就不会继续了
会的
这将导致另一个不匹配的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);
}
}
}
函数赋值器(passengerArray,i){
返回函数(名称){
警报(“喂,”+name+“!\n”+
“在鱼雷站站岗”+(i+1)+“!”;
};
}
功能分配鱼雷(姓名、乘客姓名){
对于(var i=0;i这里发生的是:
assign鱼雷()返回一个基于名称的函数,因此,每次
检查passengerArray中的名称并返回一个函数,但在
分配鱼雷可以返回鱼雷分配,i的值
更改为最后一个值(passengerArray的长度-1),因为循环将继续执行
功能分配鱼雷(姓名、乘客姓名){
无功功率分配;
对于(var i=0;i这里发生的是:
assign鱼雷()返回一个基于名称的函数,因此,每次
检查passengerArray中的名称并返回一个函数,但在
分配鱼雷可以返回鱼雷分配,i的值
更改为最后一个值(passengerArray的长度-1),因为循环将继续执行
功能分配鱼雷(姓名、乘客姓名){
无功功率分配;
对于(var i=0;我可以解释一下“每次都检查”的意思吗?(如果这令人沮丧,请道歉).如果循环继续通过匹配的i,增加每个循环,i的值不是会比匹配名称的值大吗,就像在错误的示例中一样?我的基本理解是,为了避免第一个示例中的错误,代码必须知道何时停止,也就是返回,但是如果返回没有绑定到c当满足条件且循环确实继续时,它如何知道要使用的正确i?@user4853:当调用make鱼雷赋值器
返回的函数时,它通过passengeraray
自身循环,并调用alert(“啊,“+name+”!\n”+“在鱼雷站站岗”+(i+1)+“!”)
立即。这就是为什么它拥有正确的i
:当i
增加时,涉及i
的操作已经完成。你能解释一下“它每次都检查……是什么意思吗”(如果这令人沮丧,请道歉).如果循环继续通过匹配的i,增加每个循环,i的值不是会比匹配名称的值大吗,就像在错误的示例中一样?我的基本理解是,为了避免第一个示例中的错误,代码必须知道何时停止,也就是返回,但是如果返回没有绑定到c当满足条件且循环确实继续时,它如何知道要使用的正确i?@user4853:当调用make鱼雷赋值器
返回的函数时,它通过passengeraray
自身循环,并调用alert(“啊,“+name+”!\n”+“在鱼雷站站岗”+(i+1)+“!”)
立即。这就是为什么它有权i
:当i
增加时,涉及i
的操作已经完成。
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) + "!");
// value of i
};
}
}
// value of i = length of Array since loop has executed fully
return torpedoAssignment;
}
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) + "!");
//value of i
}
}
};
}