如何解决我不明白这个 javascript 返回语句它使用这个箭头函数
谁能解释一下这个javascript语法。我不明白那个返回语句。 “person”是函数的参数吗?如果“是”,它从哪里经过?此组件中没有 person 变量。至少该 return 语句的详细版本也会有所帮助。以便我能理解
const filterBy = (term) => {
const searchTermLower = term.toLowerCase()
return (person) => Object.keys(person).some(prop =>
person[prop].toLowerCase().indexOf(searchTermLower) !== -1
)
}
const filterPerson = persons.filter(filterBy(searchTerm))
这里的 presons 是一个对象数组,搜索词是一个字符串。
const persons=[
{ name: 'abc',number: '123456' },{ name: 'def',number: '44233' },{ name: 'xyz',number: '345345' },{ name: 'npe',number: '12312' }]
稍后我使用这个返回的 filterPerson 进行后续处理。代码运行完全正常,但是 这个箭头函数作为回报让我感到困惑。如果需要更多数据,我可以更新问题。
解决方法
称为高阶函数。
您完全可以理解这意味着什么:
let increment = x => x+1;
现在假设你有一个函数,它不是像上面那样返回递增的值,而是返回另一个函数,你会怎么写?简单:
let adder = x => y => y+x;
用法:
let adder = x => y => y+x;
let add5 = adder(5);
console.log(add5(9));
这个例子也依赖于闭包的概念:x
是一个闭包(注意当我用 9 调用 add5
并返回 14 时它是如何被记住的),这是一个不同的主题,但不应该不要阻止您理解高阶函数的含义。
“person”是函数的参数吗?如果“是”,从哪里开始 路过?
就我而言,您的 person
与 y
相同。那么 y
什么时候通过?答:当我调用 add5
时,它的值为 9。
为了准确参考您的示例,您想知道什么是 person
。
示例 1
这里:
[1,2,3].filter(person=>person)
person
的值是什么? 1,3 对吗?
现在用这个替换函数 person=>person
:
示例 2
let filterBy = ()=>person=>person; // Higher order function,just first function doesn't take a parameter
[1,3].filter(filterBy())
例1和例2的区别是例1是我直接写的函数,例2是调用filterBy()
生成的。
好吧,这只是用最简单的术语编写以下函数的另一种方式:
const persons = [{
name: 'abc',number: '123456'
},{
name: 'def',number: '44233'
},{
name: 'xyz',number: '345345'
},{
name: 'npe',number: '12312'
}
];
const searchTerm = 'abc';
const filterPerson = persons.filter((person) => {
const searchTermLower = searchTerm.toLowerCase();
return Object.keys(person).some(prop => person[prop].toLowerCase().indexOf(searchTermLower) !== -1)
})
console.log(filterPerson);
如果您仔细观察,我将向 persons.filter
函数传递一个匿名函数。因此,如果我想尽情发挥,我可以将匿名函数编写为一个单独的块,然后将整个函数返回给 persons.filter
函数,以便在我的代码中的多个位置调用它。这正是您在问题中发布的代码段中所做的。
这是我想变得很花哨:
const persons = [{
name: 'abc',number: '12312'
}
];
const myFunctionThatWasPreviouslyAnonymous = (term) => {
const searchTermLower = term.toLowerCase()
return (person) =>
Object.keys(person)
.some(prop => person[prop].toLowerCase().indexOf(searchTermLower) !== -1)
}
const searchTerm = 'abc';
const filterPersonFancy = persons.filter(myFunctionThatWasPreviouslyAnonymous(searchTerm));
console.log(filterPersonFancy)