javascript - 了解闭包中的变量错误?

标签 javascript function closures

我正在学习闭包。这个例子是在闭包时犯的一个常见错误:

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/

相关文章:

javascript - 如何将json从angularjs传递到d3?

python - 什么时候需要在Python中定义单独的函数

closures - 闭包和延续之间的区别

javascript - 在数组中查找重复对象并标记这些 [Javascript lodash]

javascript - 希望两个 div 在页面加载时都设置为它们的最大高度

javascript - ChartJS 数字显示在数字顶部

javascript - 访问器属性及其函数名称

Javascript 将函数分配给现有变量

swift - 如何使用 Swift 对象方法作为闭包?

javascript - 带有对象/原型(prototype)的链式 Promise(Q 延迟)