代码之家  ›  专栏  ›  技术社区  ›  Douglas

arr.filter调用callbackFn两次吗?

  •  -2
  • Douglas  · 技术社区  · 2 年前

    第一次提问。

    我在下面的页面上看到了这个代码:

    function inBetween(a, b) {
      return function(x) {
        return x >= a && x <= b;
      };
    }
    
    let arr = [1, 2, 3, 4, 5, 6, 7];
    alert( arr.filter(inBetween(3, 6)) ); // 3,4,5,6
    

    https://javascript.info/closure#filter-through-function

    基本上,这个函数的perpose是调用arr.filter(),这样只返回X和Y之间的值: arr.filter(inBetween(3, 6))

    我应该说,这项活动的目的是展示范围和结束。

    现在我不明白的是: 为什么是arr.filter 从inBetween()而不是布尔值接收到指向另一个函数的指针/引用时出错而失败?

    看到代码工作正常,arr.filter似乎也在调用inBetween()的返回函数,但回调函数参数不应该每个项只调用一次吗?

    我想 arr.filter(inBetween(3,6)) 将失败,期望筛选器将接收指针而不是布尔值。但是arr.filter实际上似乎也调用了返回函数,这是我所没有预料到的。

    查看下面的代码:

    function hello(){
      return function (){
        return 'hello'
      }
    }
    
    

    alert(hello()) 返回指向函数的指针。为了让第二个函数返回字符串值,还需要调用hello()中的return函数 alert(hello()())

    arr.filter就是这么做的吗?如果是,那么我完全没有想到,因为我只希望调用immediate函数,而不希望调用return。

    有人能澄清一下这里发生了什么吗?

    1 回复  |  直到 2 年前
        1
  •  0
  •   Nicholas Tower    2 年前

    arr.filter需要传递一个函数。例如,如果您这样写:

    arr.filter((x) => x >= 3 && x <= 6)
    

    当执行此代码时,首先创建一个带有文本的函数 (x) => x >= 3 && x <= 6 。现在该函数已经创建,它被传递到arr.filter中。然后,arr.filtr将为数组的每个元素调用该函数。

    在您的代码中,您所做的基本相同,只是更改了创建函数的方式。你打过电话 inBetween(3, 6) 它创建并返回一个函数。然后你将返回的函数传递到arr.filter中。和以前一样,arr.filt将调用你为数组的每个元素传递的函数。array.filter不知道这个函数是如何创建的,所以它不知道 inBetween 存在。