js高阶函数-节流&防抖函数&柯里化

JS中常见的几种高阶函数

什么是高级函数

高阶函数,就是函数中可以传入另一个函数作为参数的函数。

防抖

防抖: 立即执行和非立即执行;执行一次;经常用于搜索框;

函数的防抖 就是指触发事件后在 n 秒内函数只能执行一次,如果在 n 秒内又触发了事件,则会重新计算函数执行时间。


  // 所谓防抖,就是指触发事件后在 n 秒内函数只能执行一次,如果在 n 秒内又触发了事件,则会重新计算函数执行时间。

<input type="text">
    <script>
        var ipt = document.getElementsByTagName('input')[0];
        ipt.oninput = debounce(1000,test);

       
        // 封装防抖
        function debounce(time,hanlder){
            // 当触发事件之后 等待一段时间后再触发
            var timer = null;
            return function(){
                clearTimeout(timer);
                var self = this;
                timer = setTimeout(function(){
                    hanlder();
                },time);
            }
        }


        function test(){
            console.log(ipt.value);
        }

防流

节流,就是指连续触发事件但是在 n 秒中只执行一次函数。节流会稀释函数的执行频率。

  // 节流(throttle)
        // 所谓节流,就是指连续触发事件但是在 n 秒中只执行一次函数。节流会稀释函数的执行频率。
<div>0</div>
    <button>点我</button>
    <script>
        var btn = document.getElementsByTagName('button')[0];
        var div = document.getElementsByTagName('div')[0];
        // 节流处理
        btn.onclick = thorttle(1000,test);


        function test(){
            // 让div的内容进行累加
            div.innerHTML = Number(div.innerHTML) + 1
        }

        
        function thorttle(time,hanlder){
            var lastTime = 0;
            // 记录每一次点击的时间,判断两次点击之间的间隔时间 >= 1000ms
            return function(){
                var nowTime = new Date().getTime();
                if(nowTime - lastTime >= time){
                    // 让div的内容+1
                    // 让btn的点击事件在一秒内 只能执行一次
                    hanlder();
                    lastTime = nowTime;
                } 
            }
            
        }
    </script>

柯里化

柯里化:把接收多个参数的函数变换成接收一个单一参数的函数(单一参数为多个参数中的第一个),用一句话解释就是,把一个多参数的函数转化为单参数函数的方法。

这是一个普通函数

function plus(x, y){
    return x + y
}
 
plus(1, 2) // 输出 3

经过柯里化后这个函数变成这样:

function plus(y){
    return function (x){
        return x + y
    }
}
 
plus(1)(2) // 输出 3

柯里化函数封装

  function add(a, b, c) {
            return a + b + c;
        }


        // 封装一个柯里化函数
        function curry(fn) {

            return function curryFn() {
                // 1. 一次性将所有参数传完
                // arguments
                if (arguments.length < fn.length) {
                    // 2. 没有一次性传完
                    var _arg = Array.from(arguments);
                    return function () {
                        // 当这个匿名函数被调用时
                        // 看这一传递进来的参数 + 上一次的参数 === fn.length
                        return curryFn(...Array.from(arguments).concat(_arg));
                    }
                }
                return fn(...arguments);
            }
        }
        var curryFn = curry(add);

        // console.log(curryFn(1,2,3)); 输出6
        console.log(curryFn(1, 2)(3));输出6
        console.log(curryFn(1)(2,3));输出6
        console.log(curryFn(1,2,3,4));输出6

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值