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
            }
        }
    };
}