Javascript:回调中的无点样式

标签 javascript functional-programming this pointfree

所以我想要数组 arr1 中的元素恰好也属于数组 arr2。我认为 arr1.filter(arr2.includes) 应该可以解决问题,但它给了我一个错误(见下文)。但奇怪的是,arr1.filter(x => arr2.incudes(x)) 工作正常。尽管函数 arr2.includesx => arr2.includes(x) 在引用上不相等,但它们不应该在相同的输入上采用相同的值吗?我在这里错过了什么?

> arr1 = ['a', 'b', 'c']
[ 'a', 'b', 'c' ]
> arr2 = ['a', 'c', 'd']
[ 'a', 'c', 'd' ]
>
> arr1.filter(x => arr2.includes(x))
[ 'a', 'c' ]
> arr1.filter(arr2.includes)
TypeError: Cannot convert undefined or null to object
    at includes (<anonymous>)
    at Array.filter (native)
    at repl:1:6
    ... etc ...

最佳答案

有两个原因导致您不能只执行 arr1.filter(arr2.includes):

  1. arr2.includes 只是对函数的引用,但您需要的是对函数的引用 对您想要的数组的引用在 (arr2) 上使用它。您可以使用 Function.prototype.bind 解决该问题,但是:

  2. filter 为其回调传递多个参数,而不仅仅是一个:它传递值、其索引和原始数组。 includes 将尝试使用它收到的第二个参数作为开始搜索的索引,因此当 filter 将索引传递给它时,它将使用它并跳过前导条目.

所以通常的解决方案是使用一个包装函数,它知道它需要在 arr2 上使用 includes 并且知道只向它传递一个参数——这就是你已完成箭头功能。

但另见 Michał Perłakowski's answer从函数式编程的 Angular 寻找使用实用函数创建回调函数而不是内联创建回调函数的答案。

关于Javascript:回调中的无点样式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44504482/

相关文章:

javascript - 如何通过引用 JavaScript 中的事件处理程序来传递变量?

javascript - 一些实用函数的通用类型

java - 如何执行抽象类中的java方法?

javascript - Js,将静态函数从Class设置为变量对象时 'this'是什么

javascript - 为什么我不能测试 undefined variable

javascript - 带有 Javascript 的 Windows 8 应用程序中的 Twitter/Facebook 授权

kotlin - 如何使用 Kleisli 访问调用链的每个函数中的上下文?

c++ - 停止通用 C++14 `curry` 函数递归

对象内部的 Javascript/jQuery 事件处理程序范围使用关键字 this

javascript - FullCalendar 通过 event.id 或 event.source 删除所有 eventSource 或事件