Closure in JavaScript from CoderSchool

Closure in JavaScript from CoderSchool

本文关键字:CoderSchool from JavaScript in Closure      更新时间:2023-09-26

我在CodeSchool上学习。在看教程时,我被一个例子弄糊涂了。他们在视频中试图解释的是,在循环中创建的闭包直到最后一分钟才会绑定。此代码的目的是在数组中对其进行名称检查,并单独返回名称及其位置(没有零约定)。由于闭包直到最后一分钟才绑定,因此此代码返回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。

此外,声明

在循环中创建的闭包直到最后一分钟才会绑定。

是描述事物如何运作的一种奇怪的方式。一旦在数组中找到名称,就会为变量分配一个对构造函数的引用。当assignTorpedo返回该值时,闭包存在。在闭包中,变量"i"的值已经是4。

以下语句在每次通过循环后将i递增1。因此,在第四次迭代后,i将增加一,并再次针对该条件进行测试,然后它将失败。

var arr = ["z","a","b","c"];
for ( var i = 0; i < arr.length; i++ ) {
    console.log( i );
}
console.log( i );

当违反条件"i<passengerArray.length"时,For循环结束,此时i等于4。

然后是console.log(名称+"+(4+1));

电源提示:

来自我在大学的一位讲师,

"把"For"循环想象成这样的"While"循环"

i = 0;
while (i < passengerArray.length)
{
    ...............
    i++;
}