是什么使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具有许多函数式编程功能。函数是一等对象,这意味着它们像其他任何对象一样被对待。
它还具有古怪的,类似于数组的参数,以获取传递给传统函数的参数。
如果对你有所启发和帮助,可以点个关注、收藏,也可以留言讨论,这是对作者的最大鼓励。
联系客服