科里化,是一种关于函数的高阶技术,是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,它是指将一个函数从可调用的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;