我是傲夫靠斯,欢迎关注我的公众号【前端工程师的自我修养】,每天更新。
今天我们主要来看看在JavaScript中的函数,函数在JavaScript中很重要,也有很多种使用方式,今天我们主要来复习复习箭头函数、高阶函数、柯里化函数、纯函数,它们分别是什么?在JS中有什么作用?
今日题目:
- 什么是lambda或箭头函数?和普通函数有什么区别?
- 什么是JS中的一等公民?
- 什么是高阶函数?
- 什么是柯里化函数?
- 什么是纯函数?
1. 什么是lambda或箭头函数?和普通函数有什么区别?
箭头函数是ES6的特性,箭头函数是函数表达式的简短语法,没有自己的this、arguments,并且不能作为构造函数使用,也没有prototype属性。如有这些需要还是使用普通函数。
- 没有this
const obj = {
a: 1,
getA: () => {
console.log(this.a)
},
getB: function() {
console.log(this.a)
}
}
obj.getA() // undefined
obj.getB() // 1
- 没有arguments
const fn = () => console.log(arguments)
// Uncaught ReferenceError: arguments is not defined
- 不能作为构造函数
const Foo = () => {};
const foo = new Foo(); // Uncaught TypeError: Foo is not a constructor
- 没有prototype属性
const Foo = () => {};
console.log(Foo.prototype); // undefined
2. 什么是JS中的一等公民?
在JavaScript语言中,函数是一等公民。一等公民意味着在JavaScript中函数可以作为变量在任何地方使用。
比如说,在JS中,一个函数可以作为参数传给其他函数,并由其他函数返回,也可以作为一个值分配给一个变量。
下面的例子里,handler
函数作为一个变量作为参数传给了addEventListener
函数。
const handler = () => console.log ('这是一个事件监听函数');
document.addEventListener ('click', handler);
3. 什么是高阶函数?
简单来说,高阶函数是接收一个函数作为参数或者返回一个函数作为返回值或者两者都有的函数。
const log = () => console.log ('hello world');
const callFun = fn => fn();
callFun(log);
4. 什么是柯里化函数?
柯里化是将多个参数的函数转换为每个只有一个参数的函数序列的过程。柯里化(Currying)是以数学家Haskell Curry的名字命名。
const add = (a, b, c) => a + b + c;
console.log(add(1,2,3)); // 6
const curryUnaryFunction = a => b => c => a + b + c;
curryUnaryFunction (1); // 输出: b => c => 1 + b + c
curryUnaryFunction (1) (2); // 输出: c => 3 + c
curryUnaryFunction (1) (2) (3); // 输出: 6
柯里化函数可能平时我们接触的比较少,甚至是没听过,但它确实非常适合提高代码的复用性,实现更高阶的函数组合封装。
5. 什么是纯函数?
纯函数是返回值仅由其参数确定的一种函数,而没有任何的副作用。即在任何时间输入相同参数,函数的返回值皆为相同。
举个例子,纯函数和非纯函数的区别
//非纯函数
let numberArray = [];
const impureAddNumber = number => numberArray.push(number);
//纯函数
const pureAddNumber = number => argNumberArray =>
argNumberArray.concat([number]);
console.log (impureAddNumber(6)); // 输出: 1
console.log (numberArray); // 输出: [6]
console.log (pureAddNumber(7)(numberArray)); // 输出: [6, 7]
console.log (numberArray); // 输出: [6]
第一个函数改变函数外部的数组,返回一个与参数无关的返回值,所以这不是一个纯函数。
另外一个函数,使用concat将传入的数组与另一个数组合并,产生一个没有副作用的全新数组。
纯函数很重要,它使单元测试更加简单,没有任何副作用,也不需要依赖注入,避免了紧耦合。
唠叨
今天的内容稍微有些深入,但要成为一名优秀的前端工程师是必须掌握的。
感谢大家的阅读,您的点赞、评论、关注是对我最大的鼓励 O(∩_∩)O👍👍👍
我是傲夫靠斯,微信搜【前端工程师的自我修养】,让我们每天进步一点点,期待更好的自己。