第一次提问。
我从下面的页面看到了这段代码:
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 正在做的事情吗?如果是,那么我完全没想到,因为我只希望调用立即函数,而不是返回。
有人可以澄清这里发生了什么吗?
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
存在。