arr.filter是否调用callbackFn两次?

问题描述 投票:0回答:1

第一次提问。

我从下面的页面看到了这段代码:

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

基本上,此函数的目的是调用 arr.filter(),以便仅返回 X 和 Y 之间的值:

arr.filter(inBetween(3, 6))

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

这就是我不明白的地方: 为什么 arr.filter not 因从 inBetween() 接收到另一个函数的指针/引用而不是布尔值而失败并出现错误?

看到代码有效,看来 arr.filter 也调用了 inBetween() 的返回函数,但是回调函数参数不应该每个项目只调用一次吗?

我认为

arr.filter(inBetween(3, 6))
会失败,期望过滤器会收到一个指针而不是布尔值。但 arr.filter 实际上似乎也调用了返回函数,这是我没想到的。

看下面的代码:

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

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

这就是 arr.filter 正在做的事情吗?如果是,那么我完全没想到,因为我只希望调用立即函数,而不是返回。

有人可以澄清这里发生了什么吗?

javascript callback scope arguments return-value
1个回答
0
投票

arr.filter 期望传递一个函数。例如,如果你这样写:

arr.filter((a, b) => b - a).

当执行此代码时,它首先创建一个带有文本

arr.filter((a, b) => b - a)
的函数。现在该函数已创建,它被传递到 arr.filter 中。然后 arr.filter 将为数组的每个元素调用该函数。

在您的代码中,您所做的事情大致相同,只是更改了创建函数的方式。您调用

inBetween(3, 6)
创建并返回一个函数。然后将返回的函数传递到 arr.filter 中。和以前一样,arr.filter 将为数组的每个元素调用该函数。我所说的“函数”是指它传递的函数。 arr.filter 不知道这个函数是如何创建的;它不知道
inBetween
存在。

© www.soinside.com 2019 - 2024. All rights reserved.