一、高阶函数是对其他函数进行操作的函数,操作可以是将它们作为参数,或者是返回它们。 简单来说,高阶函数是一个接收函数作为参数或将函数作为输出返回的函数。

【示例】Array.prototype.map,Array.prototype.filter 和 Array.prototype.reduce 是语言中内置的一些高阶函数。

二、高阶函数的核心是闭包,利用闭包缓存一些未来会用到的变量,可以实现柯里化、偏应用…

应用

节流

【见】节流:https://www.yuque.com/webfront/js/vcwe7d

防抖

【见】防抖:https://www.yuque.com/webfront/js/ldeqn8

惰性函数

一、当我们需要重复使用一个逻辑的时候,优化逻辑判断,提高 JavaScript 性能
二、原理:同名函数覆盖

| 【示例】```javascript function createXHR() { var xhr try { xhr = new XMLHttpRequest() } catch (e) { handleErr(e) try { xhr = new ActiveXObject(‘Msxml2.XMLHTTP’) } catch (e) { try { xhr = new ActiveXObject(‘Microsoft.XMLHTTP’) } catch (e) { xhr = null } } } return xhr }

function handleErr(e) { // do sth }

  1. |
  2. | --- |
  3. | 【示例】惰性函数修改版:```javascript
  4. function createXHR() {
  5. var xhr
  6. if(typeof XMLHttpRequest !== 'undefined') {
  7. xhr = new XMLHttpRequest()
  8. createXHR = function() {
  9. return new XMLHttpRequest()
  10. }
  11. } else {
  12. try {
  13. xhr = new ActiveXObject('Msxml2.XMLHTTP')
  14. createXHR = function() {
  15. return new ActiveXObject('Msxml2.XMLHTTP')
  16. }
  17. } catch(e) {
  18. try {
  19. xhr = new ActiveXObject('Microsoft.XMLHTTP')
  20. createXHR = function() {
  21. return new ActiveXObject('Microsoft.XMLHTTP')
  22. }
  23. } catch(e) {
  24. createXHR = function() {
  25. return null
  26. }
  27. }
  28. }
  29. }
  30. return xhr
  31. }

1、通过上面修改之后,当我们在第一次调用这个函数的时候就会去判断当前的环境,进而将函数优化简写,不需要再进行后续的判断
2、比如,上述代码中的 XMLHTTPRequest 如果是存在的,那么当我们第二次调用这个函数的时候已经是这样了```javascript function createXHR() { return new XMLHttpRequest() }

 |
| --- |

三、使用场景:

- 频繁使用同一判断逻辑
- 只需要判断一次,后续使用环境稳定
<a name="Jhezp"></a>
### <br /><br />
<a name="Nf8YC"></a>
## 级联函数
一、其实就是链式调用,所以原理也就很简单:在每个方法中将对象本身 return 出去

| 【示例】假设我们有一个 Person 模板```javascript
function Person() {}
// 添加几个方法
Person.prototype = {
    setName: function (name) {
        this.name = name
        return this
    },
    setAge: function (age) {
        this.age = age
        return this
    },
    setSex: function (sex) {
        this.sex = sex
    },
}
// 别忘了重新指定一下构造函数
Person.constructor = Person
let person = new Person()
// 这样看起来做了很多重复的事情,稍微修改一下,在每个方法中将 this return 出来就可以达到 链式调用的效果
person.setName('游荡de蝌蚪')
person.setAge(18)
person.setSex('male')
// 修改之后
person.setName('游荡de蝌蚪').setAge(18).setSex('male')
console.log(person)

| | —- |

二、优缺点

  • 优点:简化了函数调用的步骤,我们不需要再写一些重复的东西
  • 缺点:占用了函数的返回值

柯里化

【见】柯里化:https://www.yuque.com/webfront/js/rv3mal