美文网首页
高阶函数

高阶函数

作者: 月离丶 | 来源:发表于2019-03-16 23:54 被阅读0次

概念

1.函数可以作为参数被传递
2.函数可以作为返回值输出

至少满足以上条件之一的函数,都可以成为高阶函数。

具体示例

1.函数作为参数被传递

1.1 Array.prototype.sort
Array.prototype.sort 可以接收一个函数作为入参,决定数组的排序规则:

[1,3,2].sort(function(a,b){
  return a-b
}) //[1,2,3]

1.2 回调函数作为参数

function drawImg(callback) {
  var img = new Image()
    if(typeof callback === 'function'){
      img.onload = callback
    }
  img.src = '1.png'
}

回调函数不仅仅适用于img的加载过程,同样适用于ajax异步请求。另外,当一个函数里多个image或者dom节点需要执行同样的操作时,也可以将这些操作封装进一个函数里,作为当前函数的入参,易于修改和维护。

function drawImg(len, callback) {
  var imgs = []
  for(let i = 0; i < len; i ++) {
    var img = new Image()
      if(typeof callback === 'function'){
        img.onload = callback
      }
    img.src = '1.png'
    imgs.push(img)
  }
}

2.函数作为返回值输出

2.1判断数据的类型

之前,当我们判断一个数据是不是数组,会去判断这个数据是否有length属性、有没有sort方法或者push方法等,这种方法被称为鸭子模型但是最好的方法是根据Object.prototype.toString来判断,如果是数组,Object.prototype.toString.call()就会返回[Object Array];同样的,如果是字符串,返回[Object String];如果是布尔值,返回[Object Boolean]。可以看出,大部分实现是相同的,可以将不同的部分作为参数传入函数中:

var isType = function( type ){
return function( obj ){
return Object.prototype.toString.call( obj ) === '[object '+ type +']';
}
var isString = isType( 'String' );
var isArray = isType( 'Array' );
var isNumber = isType( 'Number' );

2.2 单例模式
单例模式是保证一个类只有一个实例,并提供一个全局访问的访问点。

var getSingle = function(fn:Function) {
  var result:any
  return function () {
    return result || (result = fn.apply(this, arguments))
  }
}
  1. 其他应用

3.1 函数柯里化

首先会接受一些参数,接受这些参数后不会立刻求值,而是继续返回另一个函数,之前传入的参数会保存起来,直到函数真正需要求值的时候,之前传入的所有参数会一次性用于求值。

var currying = function(fn) {
  var args = [];

  return function() {
    if (arguments.length === 0) {
      return fn.apply(this, args); // 没传参数时,调用这个函数
    } else {
      [].push.apply(args, arguments); // 传入了参数,把参数保存下来
      return arguments.callee; // 返回这个函数的引用
    }
  }
}

3.2 函数反柯里化

扩大函数的作用范围,比如之前函数只能用于Array可以扩展到所有对象都可以使用

var uncurrying= function (fn) {
    return function () {
        var args=[].slice.call(arguments,1);
        return fn.apply(arguments[0],args);        
    }    
};

3.3 函数节流与函数防抖

函数节流:一定时间内js方法只跑一次。比如生活中的坐地铁,像杭州的二号线,基本每五分钟才会有一辆地铁到站。
函数防抖:频繁触发的情况下,只有足够的空闲时间,才执行代码一次。 比如生活中的坐公交,就是一定时间内,如果有人陆续刷卡上车,司机就不会开车。只有别人没刷卡了,司机才开车。

  • 函数节流:
function throttle(fn, threshhold) {
    var timeout
    var start = new Date;
    var threshhold = threshhold || 160
    return function () {
        var context = this,
            args = arguments,
            curr = new Date() - 0
        clearTimeout(timeout) //总是干掉事件回调
        if (curr - start >= threshhold) {
            console.log("now", curr, curr - start)
            fn.apply(context, args)
            start = curr
        } else {
            //让方法在脱离事件后也能执行一次
            timeout = setTimeout(function () {
                fn.apply(context, args)
            }, threshhold);
        }
    }
}
  • 函数防抖
function debounce(func, delay) {
    var timeout;
    return function (e) {
        console.log("清除", timeout, e.target.value)
        clearTimeout(timeout);
        var context = this,
            args = arguments
        console.log("新的", timeout, e.target.value)
        timeout = setTimeout(function () {
            console.log("----")
            func.apply(context, args);
        }, delay)
    };
};

3.4 其他
当然,高阶函数的应用不止这些,比如装饰者模式、React的高阶组件等,需要大家去发现和应用。

相关文章

  • python学习(三)函数式编程

    高阶函数 函数也是变量,函数参数为函数的函数,称作高阶函数 自定义高阶函数 内建高阶函数 map/reducema...

  • 11.Lambda和高阶函数(Lambda and Higher

    高阶函数 kotlin_Lambda,高阶函数 *swift_高阶函数

  • Python | 高阶函数基本应用及Decorator装饰器

    一、高阶函数 理解什么是高阶函数?以及高阶函数的基本应用方法 ▲ 高阶函数 在了解什么是高阶函数之前,我们来看几个...

  • 四、函数进阶

    一. 高阶函数 参数类型包含函数类型或返回值类型为函数类型的函数为高阶函数。 常见的高阶函数 高阶函数的调用 二....

  • Kotlin 高阶函数

    什么是高阶函数 将函数作为参数或者返回值的,称高阶函数。 定义高阶函数 action是一个高阶函数,(Int) -...

  • 高阶组件

    高阶组件 先来引入这个概念 高阶函数是什么? 高阶函数就是一个函数返回一个函数eg: 高阶组件 类同 高阶组件就是...

  • [JS函数] (Array)の高阶函数

    JS函数 高阶函数 高阶函数英文叫Higher-order function。那么什么是高阶函数? JavaScr...

  • HOC - High Order Component 高阶组件

    高阶函数 简而言之,可以接收函数作为参数的函数就是一个高阶函数。 上面的hoc函数就是一个高阶函数。 高阶组件 高...

  • Day10. 高阶组件

    1. 认识高阶函数 什么是高阶组件呢?认识高阶函数.png 高阶函数: 接收一个或多个函数作为输入, 输出一个函数...

  • Python高阶函数

    本文要点 1.什么是高阶函数 2.python中有哪些常用的高阶函数 什么是高阶函数? 在了解什么是高阶函数之前,...

网友评论

      本文标题:高阶函数

      本文链接:https://www.haomeiwen.com/subject/trtvgftx.html