Javascript 令人难以置信的循环函数

Javascript 令人难以置信的循环函数,javascript,Javascript,如果有人能帮助我理解这一点,我会留下深刻印象。这是28号 这里有一个循环函数,如果你看一下教程,它似乎运行了3次,产生了下面的6次循环 请您尽可能详细地用通俗易懂的语言解释一下本节目中发生了什么,并在此过程中进行解释: fn.call(数组,数组[i],i)为什么函数中有这3个参数以及它们是如何工作的。该函数是否先处理数组,然后处理数组[i],然后处理i?当这一切发生时发生了什么 另外,在函数中,我知道I++每次经过array.length时都会上升,但是是什么触发num++来增加它的值,以及

如果有人能帮助我理解这一点,我会留下深刻印象。这是28号

这里有一个循环函数,如果你看一下教程,它似乎运行了3次,产生了下面的6次循环

请您尽可能详细地用通俗易懂的语言解释一下本节目中发生了什么,并在此过程中进行解释:

  • fn.call(数组,数组[i],i)
    为什么函数中有这3个参数以及它们是如何工作的。该函数是否先处理数组,然后处理数组[i],然后处理i?当这一切发生时发生了什么

  • 另外,在函数中,我知道
    I++
    每次经过array.length时都会上升,但是是什么触发
    num++
    来增加它的值,以及
    value==num++

  • 函数(值,i)
    中,什么是
    ?循环数组的值是否交替为0,1,2?如果是这样,这些循环数组号如何作为参数在
    函数(value,i)

  • 此数组实例
    此实例试图显示什么?怎么做

  • 代码:

    函数循环(数组,fn){
    对于(var i=0;i
    通过,确保内容符合我们的预期。
    传递上下文应该是完整数组
    通过检查,确保内容符合我们的预期
    传递上下文应该是完整数组
    通过检查,确保内容符合我们的预期
    传递上下文应该是完整数组

    fn是一个函数指针,指向调用循环时创建的匿名函数

    a) 有三个参数,因为第一个参数是对要作用的对象的引用,即数组,第二个参数只是数组迭代中的当前值,第三个值是该元素在该数组中的位置

    b) 当您调用num++时,它会递增num的值。递增后返回值(aka赋值),然后递增num

    c) value是fn传入的第二个参数。调用一对队列


    d) 这是指在fn.call()调用中传入第一个parmater的数组

    我实际上不懂javascript,但我相信我了解发生了什么

    前四行定义了一个名为loop的函数。循环接受两个变量,一个数组和一个函数。我认为第二个参数是函数的唯一原因是因为编码器调用了可能调用函数的变量call。函数循环遍历数组的元素,并通过调用方法以某种方式将它们传递给函数。你应该查一下这部分

    在定义之后,num被定义为从零开始


    然后是有趣的部分。使用参数[0,1,2]和一个当场创建的匿名函数调用函数循环。函数(value,i)及其后的所有内容都是此匿名函数的定义。它没有名字,但只是为这个函数调用定义的。函数检查以确保值等于num并在其后递增num,然后检查以确保变量是数组。

    函数
    是匿名函数,即没有名称的函数。
    循环
    的第二个完整参数是

    function(value, i) {
      assert(value == num++, "Make sure the contents are as we expect it.");
      assert(this instanceOf Array, "The context should be the full array.");
    }
    
    这是一个完整的匿名函数,它接受三个参数:
    this
    (它作为方法的对象)、当前值和循环计数器

    loop
    迭代数组,并使用
    fn.call
    调用匿名函数,向其传递三个参数;在这里,数组对象必须是显式的,因为
    call
    不知道调用它的函数引用应该在什么上下文中调用(也就是说,在调用中如何生成
    this

    循环调用的匿名函数作为
    this
    接收数组。第二个
    ASSERT
    验证这一点。它还希望数组的值是
    [0,1,2]
    ,并通过在每次调用中递增
    num
    并将其与传递的数组元素进行比较来验证这一点

    因此,遵循执行链:

  • num
    被声明并初始化为0
  • 调用循环([0,1,2],函数…)
  • loop
    调用匿名函数
    fn
    ,该函数使用数组(如
    this
    )、其第一个元素和指示元素偏移量的
    i
    。(
    i
    从未实际使用过。)
  • 匿名函数
    通过比较
    num
    并随后递增
    num
    来断言它传递了预期的第一个元素0
  • 匿名函数
    断言它的
    this
    是一个
    数组
  • loop
    调用
    fn
    ,如#3所示,但使用第二个数组元素
  • 匿名函数再次执行其
    ASSERT
    s,这次将传递的第二个数组元素(预计为1)与
    num
    (由于步骤4中的后期增量,该元素为1)进行比较
  • loop
    像以前一样使用第三个数组元素调用
    fn
  • 匿名函数再次执行其
    断言
    s,这次将预期的数组元素2与值现在为2的
    num
    进行比较

  • 我认为理解发生了什么的一个更简单的方法是删除
    call
    的用法,而是直接调用该方法
    function(value, i) {
      assert(value == num++, "Make sure the contents are as we expect it.");
      assert(this instanceOf Array, "The context should be the full array.");
    }
    
    function loop(array, fn) {
        for(var i = 0; i < array.length; i++)
            fn(array[i], i);
    }
    
    var num = 0;
    loop([0, 1, 2], function(value, i) {
        assert(value == num, "Make sure the contents are as we expect it.");
        assert(this instanceof Array, "The context should be the full array.");
        num++;
    });
    
    fn.call(array, array[i], i);
    
    fn.call([], array[i], i);
    fn.call([1,2,3,4,5], array[i], i);