科里化

202 阅读2分钟

科里化,是一种关于函数的高阶技术,是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,它是指将一个函数从可调用的f(a, b, c), 转换为可调用的 f(a)(b)(c)。
即部分求值,一个柯里化的函数首先会接收一些参数,接收了这些参数后,该函数并不会立即求值,而是继续返回另外一个函数,刚才传入的参数在函数形成的闭包中被保存起来。待到函数被真正需要求值的时候,之前传入的所有参数都会被一次性用于求值。

  • 让函数变得更灵活
  • 可以把多元函数变成一元函数,可以组合使用函数产生强大函数
  • 前端使用柯里化的用途主要就应该是简化代码结构,提高系统的维护性,一个方法,只有一个参数,强制了功能的单一性,很自然就做到了功能内聚,降低耦合。

首先了解:[].slice.call(arguments, 1) 其含义相当于 arguments.slice(1),就是取出所有参数,并从下标为1开始,截取所有。

function ordinary(a,b,c,d){ console.log(我是${a}${b}${c}${d}) }

ordinary(1,2,3,4)

科里化函数:
function curry(a,b){
    return function(c,d){
    console.log(console.log(`我是${a}${b}${c}${d}`))
}}

curry(1,2)(3,4)
函数防抖:
函数防抖定义:当持续触发一个事件时,在n秒内,事件没有再次触发,此时才会执行回调;如果n秒内,又触发了事件,就重新计时;
使用场景:
- 防止用户不断输入过程中,不断请求资源,n秒内只发送1次,用防抖来节约资源
- 监听resize触发时, 不断的调整浏览器窗口大小会不断触发resize,使用防抖可以让其只执行一次
function debounce(fn, delay){
    let timer;
    return function(){
        let that = this, innerArgs = [].slice.call(arguments);
        clearTimeout(timer);
        timer = setTimeout(function(){
            fn.apply(that,innerArgs);
        },delay)
    }
};

window.onscroll = debounce(function(){
    console.log("翻滚吧!")
},100)
函数节流:
定义:当频繁的触发一个事件,每隔一段时间, 只会执行一次事件。
适用场景:
- 拖拽场景:固定时间内只执行一次, 防止高频率的的触发位置变动
- 监听滚动事件:实现触底加载更多功能
- 屏幕尺寸变化时, 页面内容随之变动,执行相应的逻辑
function throtte(fn,delay){
var prevTime = +new Date();
        return function (){
            let curTime = +new Date();
            if(curTime - prevTime > delay) {
                fn.apply(this,arguments);
                prevTime = curTime;
            }
        }
}

let throtteScroll = throtte(function(){
    console.log(123)
},500);

window.oncscroll = throtteScroll;