arr.filter为何可接收inBetween返回的函数而非布尔值?
Array.filter 与闭包回调的机制澄清
先明确核心点:Array.filter() 的参数必须是一个函数,而不是布尔值。这个函数会被 filter 自动调用——遍历数组时,它会把每个元素逐个传给这个回调函数,根据返回的布尔值决定是否保留当前元素。
你的代码执行流程拆解
看这段闭包代码:
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
- 先执行
inBetween(3, 6):这个函数执行后,返回的是一个闭包函数的引用(就是那个接收x的匿名函数),并且这个闭包记住了外部的a=3和b=6。 - 把这个闭包函数传给
arr.filter()——这完全符合filter对参数的要求,因为它要的就是能处理元素的函数。 filter内部开始遍历数组:- 拿第一个元素
1,调用闭包函数并传入1,判断1 >=3 && 1 <=6,返回false,不保留这个元素。 - 拿第二个元素
2,同样调用闭包,返回false,不保留。 - 直到元素
3,调用闭包返回true,保留该元素;后续4、5、6同理,最后收集所有符合条件的元素返回。
- 拿第一个元素
和你的 hello() 例子的区别
你的对比代码:
function hello(){ return function (){ return 'hello' } }
alert(hello()) 显示函数引用,是因为 alert 需要的是可直接显示的值(字符串、数字等),而 hello() 返回的是函数,所以它只能显示函数本身的引用;而 filter 要的就是函数,它会自动帮你调用这个函数,不需要你手动加 () 执行。
简单说:alert 是“直接用你传的值”,filter 是“拿你传的函数来用,自己去调用它处理每个元素”。
内容的提问来源于stack exchange,提问作者Douglas
相关产品推荐
相关产品推荐

