JavaScript基础之函数截流、防抖、柯理化

本文深入探讨了前端开发中常见的函数优化技术:截流、防抖和柯理化。介绍了这些技术的应用场景、实现方式及背后的原理,帮助开发者提高代码效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

函数截流,防抖,柯理化,前端的基础,是每个公司必会问到的点。

函数截流指连续触发事件但是在 n 秒中只执行一次函数。即 2n 秒内执行 2 次... 。节流如字面意思,会稀释函数的执行频率。

应用场景:例如,按钮被多次点击

实现的方式:

(1)定时器方式

let throttle = (fun, time) => {
    let timeout
    return function () {
        let self = this
        let args = arguments
        if (!timeout) {
            timeout = setTimeout(function () {
                timeout = null
                fun.apply(self, args)
            }, time)
        }
    }
}

(2)时间戳方式

let throttle = (fun, time) => {
    let pre = 0
    return function () {
        let now = Date.now()
        let self = this
        let args = arguments
        if (now -pre > time) {
            fun.apply(self, args)
            pre = now
        }
    }
}

函数防抖短时间内多次触发同一事件,只执行最后一次,或者只执行最开始的一次,中间的不执行。

应用场景:在input输入框连续输入向后端发起请求

实现方式:

(1)非立即执行:非立即执行版的意思是触发事件后函数不会立即执行,而是在 n 秒后执行,如果在 n 秒内又触发了事件,则会重新计算函数执行时间。

let debounce = (fun, time) => {
    let timer
    return function () {
        let self = this
        let args = arguments
        if (timer) clearTimeout(timer)
        timer = setTimeout(() => {
            fun.apply(self, args)
        }, time)
    }
}

(2)立即执行:立即执行版的意思是触发事件后函数会立即执行,然后 n 秒内不触发事件才能继续执行函数的效果。

let debounce = (fun, time) => {
    let timer
    return function () {
        let self = this
        let args = arguments
        if (timer) clearTimeout(timer)
        timer = setTimeout(() => {
            timer = null
        }, time)
        if (!timer) fun.apply(self, args)
    }
}

函数柯理化:柯理化就是将多参数的函数,转化为单一参数的函数;也就是说,一个多参数的函数,接收了全部的参数,那么就返回该函数的函数值,否则就返回一个柯理化的函数。

实现方式:

let curry = (fuc) => {
    let limit = fun.length
    let params = []
    return function _curry (...args) {
        if (limit <= params.length) {
            return fun.apply(null, params)
        }
        return _curry
    }
}

为什么要函数柯理化:

1、参数复用

原理就是利用闭包的原理,让上一步被传进来的参数不被释放掉,可以继续复用。

2、提前确认

提前判明一些情况,处理兼容性问题,比如addEventlistener这个方法并不是所有浏览器都可以使用,所以可以提前确认。

3、延迟加载

js中的bind方法,就是利用的这个特性。

以上就是,函数的截流、防抖、柯理化的简单介绍,以及初步实现,面试的时候一定有用。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值