我正在学习数组方法,有一件事我不太了解,可能与闭包有关。
首先,这是代码段:
let range = {
minNumber: 20,
maxNumber: 30,
isValid(number) {
return number >= this.minNumber && number < this.maxNumber;
}
};
let numbers = [16, 23, 27, 30, 45];
let filteredNumbers = numbers.filter(range.isValid, range);
console.log(filteredNumbers.length); // 2
console.log(filteredNumbers[0]); // 23
console.log(filteredNumbers[1]); // 27
根据我的理解,通过传递第二个参数,我们将this
绑定到range
,否则简单地调用:numbers.filter(range.isValid)
将使this
不确定。
this
运算符从isValid
上下文中“调用” range
的同时,它是否也不能访问.
?
还有另一种可行的方法:
numbers.filter(number => range.isValid(number))
这是怎么回事?现在可以突然从this
对象中拾取range
了吗?箭头函数没有this
iirc,所以不是。
非常感谢您提供的所有帮助。 :)
答案 0 :(得分:1)
我的理解是,当您致电
numbers.filter(range.isValid)
您正在做的是通过引用或
传递函数numbers.filter(isValid(number) {
return number >= this.minNumber && number < this.maxNumber;
})
有效地传输上下文(例如,在任何地方都没有设置maxNumber和minNumber)
执行时
numbers.filter(number => range.isValid(number))
之所以起作用,是因为=>函数未建立上下文,因此它从当前作用域的范围定义中获取上下文。
执行时
numbers.filter(range.isValid, range)
您正在使用可选参数来过滤以下所述的过滤器(来自W3C文档:https://www.w3schools.com/jsref/jsref_filter.asp)
可选。要传递给函数的值 “此”值。如果此参数为空,则值“ undefined”将 作为其“ this”值传递