数组方法中关于“ thisArg”的困惑

时间:2019-11-29 17:11:29

标签: javascript this

我正在学习数组方法,有一件事我不太了解,可能与闭包有关。

首先,这是代码段:

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,所以不是。

非常感谢您提供的所有帮助。 :)

1 个答案:

答案 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”值传递