防抖中this和arguments的问题

防抖中this和arguments的问题

// 防抖
function debounce(fn, delay = 500) {
    // timer 是闭包中的
    let timer = null

    return function () {
        if (timer) {
            clearTimeout(timer)
        }
        timer = setTimeout(() => {
            // 这里的this指向触发keyup事件的元素
            fn.apply(this, arguments)
            timer = null
        }, delay)
    }
}

input1.addEventListener('keyup', debounce(function (e) {
    console.log(e.target)
    console.log(input1.value)
}, 600))

老师请问

fn.apply(this, arguments)

这里的argument指什么,e又是怎么传进去的?

debounce(function (e) {
    console.log(e.target)
    console.log(input1.value)
}


正在回答

登陆购买课程后可参与讨论,去登陆

1回答

同学你好,对于你的问题解答如下:

1、arguments指的是获取传入函数中的所有参数。由于箭头函数中不存在arguments,所以这里的arguments指的是获取调用下图选中的函数时,传入的所有参数

https://img1.sycdn.imooc.com//climg/625271ef0904dbcb06570459.jpg

2、具体可以参考如下解析:

给input1绑定keyup事件时,由于addEventListener方法的第二个参数是一个“函数的调用”,所以debounce函数的返回值,是keyup的事件处理函数,如下:

https://img1.sycdn.imooc.com//climg/625273ab097735b108730576.jpg

即:keyup事件触发时,实际执行就是上图中选中的函数(return 后面那个function(){}),事件触发时,会默认往事件处理函数中,传递一个参数e(事件对象), 而由于调用debounce时,传入了两个参数,传入的第一个参数,就是fn,具体可以结合下图标注理解:

https://img1.sycdn.imooc.com//climg/625277b909d7d52308400619.jpg

祝学习愉快~

  • 老师,这里的arguments即e吗?为什么不直接写e就好了?

    2022-08-24 21:00:59
  • 问题解答如下:

    1、这里的arguments确实接收的是e。

    2、因为e是系统调用keyup事件函数处理函数传入的参数,fn.apply(this,arguments) 这句代码所在作用域中并没有设置e,所以老师直接使用arguments来获取return 返回的函数中接受的参数。

    祝学习愉快~

    2022-08-25 09:54:10
  • 好的,谢谢子老师

    2022-08-25 12:56:23
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师