是什么使JavaScript成为函数式语言? 函数式编程是一种编程范式,指示了我们构建应用程序的方式。函数式编程将程序中的函数视为数学函数。 这意味着我们避免更改状态和创建可变数据,它也意味着函数是纯函数,也就是说,一个函数在相同的输入条件下返回相同的东西。 函数在函数式编程中也不应该有副作用,因为它会使函数不纯。 JavaScript函数也是一级函数,这意味着我们可以用函数作为参数或者函数返回函数。 它还支持闭包,在这里我们返回可以在父函数中使用某些值的函数。 例如,JavaScript数组具有 map,filter 和 reduce 方法,它们采用回调函数来处理数组中的项。 map,filter 和 reduce 是高阶函数,因为它们接受函数作为参数,返回函数的函数也是高阶函数。 例如,可以按如下方式使用 map 方法: const nums=[1,2,3]; const doubleNums=nums.map(x=> x*2); 在上面的代码中,我们将函数 x=> x * 2 传递给 map。 x=> x * 2 执行每个数组项执行指定的计算,然后返回具有新值的新数组,然后我们得到 doubleNum 为 [2,4,6]。
高阶函数是将函数作为参数或返回函数的函数。 例如,如果我们有: const hoc=(fn)=> fn(); hoc(()=>{ console.log('foo'); }); 上面的代码具有 hoc 函数,该函数接受函数 fn 并运行它。 然后,当我们进行以下调用时: hoc(()=>{ console.log('foo'); }); 然后,由于传入的函数在 hoc 函数中运行,因此我们输出了 foo。
JavaScript函数是一等对象,因为它们像任何其他类型的富贵对象一样被对待。 这意味着函数可以存储在变量,对象或数组中。它们可以作为参数传递给函数。同样,它们可以从函数中返回。 例如,我们可以将函数分配给变量,如下所示: let foo=()=> {}; 我们为变量 foo 分配了一个箭头函数。 同样,它们可以作为参数传递,如下所示: let foo=()=> { console.log('foo'); }; let bar=(fn)=> fn(); bar(foo); 然后,我们可以传入 foo 来调用 bar。请注意,我们只是传入 foo 的引用,而没有调用它。因此,在 foo 之后没有括号。 可以通过以下函数返回它们: let foo=()=> { return ()=> console.log('foo') }; foo()(); 上面的 foo 函数返回一个输出 'foo' 的函数。 然后我们像在最后一行中那样调用它。 JavaScript函数也可以存储在对象和数组中。例如,我们可以这样写: let obj={ foo: ()=> { console.log("foo"); } }; obj.foo(); 我们将 foo 函数作为属性放入对象中,然后在最后一行中对其进行调用。 最后,我们可以将它们存储在数组中,如下所示: const arr=[ ()=> { console.log("foo"); } ]; arr[0](); 或者我们可以调用 push 将其放入数组中: const arr=[]; arr.push(()=> { console.log("foo"); }); arr[0](); arguments 对象是一个类似数组的对象,它具有我们传递给函数的参数。类似数组的意思是它具有 length 属性,我们可以通过使用索引来获取项目,从而循环遍历所有项目,但是它没有像 map,reduce 或 filter 这样的数组方法。 它仅得到传统函数的参数。 例如,我们可以这样写: function foo() { console.log(arguments); } foo(1, 2, 3, 4, 5); 然后 console.log 将向我们返回传递给 foo 的参数,即1、2、3、4和5。 箭头函数没有绑定到 arguments 对象,所以我们不能把所有的参数都用这个对象传递给箭头函数。 for ... of 循环也适用于 arguments 对象,因此我们可以如下遍历参数: function foo() { for (let arg of arguments) { console.log(arg); } } foo(1, 2, 3, 4, 5); 我们可以使用扩展运算符将参数转换为数组。例如,我们可以这样写: function foo() { console.log([...arguments]); } foo(1, 2, 3, 4, 5); 然后,我们输出了 [1,2,3,4,5]。 总结 JavaScript具有许多函数式编程功能。函数是一等对象,这意味着它们像其他任何对象一样被对待。 它还具有古怪的,类似于数组的参数,以获取传递给传统函数的参数。 如果对你有所启发和帮助,可以点个关注、收藏,也可以留言讨论,这是对作者的最大鼓励。 |
|
来自: 新用户26922hFh > 《待分类》