为了账号安全,请及时绑定邮箱和手机立即绑定

看了别人实现的节流代码,十分不理解这个闭包里this,arguments的含义,望指点一二

看了别人实现的节流代码,十分不理解这个闭包里this,arguments的含义,望指点一二

哔哔one 2019-05-12 12:14:45
functionthrottle(fn,interval){vartimer,isFirst=true;returnfunction(){//////////////////////////////////////////////////////////////////////varargs=arguments,就是这里了that=this;///////////////////////////////////////////////////////////////////////if(isFirst){fn.apply(that,args)returnisFirst=false}if(timer){return}timer=setTimeout(()=>{clearTimeout(timer)timer=nullfn.apply(that,args)},interval||1000);}}
查看完整描述

2 回答

?
12345678_0001

TA贡献1802条经验 获得超5个赞

首先你要明白,throttle的功能是接受一个函数并返回一个新的函数,这个函数有节流的功能。
用法会是这样:
functionhandleClick(param){console.log('clicked',param)};
constthrottledHandleClick=throttle(handleClick,2000)
//下面的代码只会打印一次clicked
throttledHandleClick('p')
throttledHandleClick('p')
throttledHandleClick('p')
所以你说的arguments其实就是
{
0:'p',
}
如果你不fn.apply(that,arguments),而是fn()那么参数就会丢失
关于this,个人感觉this应该取决于生成函数时候的执行方式,throttle(handleClick,2000),所以this就是window。而不是如你写的取决于最终函数throttledHandleClick的调用方式。
如果按照我的理解应该这么写:
functionthrottle(fn,interval){
vartimer,
isFirst=true;
that=this;//注意这里
returnfunction(){
if(isFirst){
fn.apply(that,arguments)
returnisFirst=false
}
timer=setTimeout(()=>{
clearTimeout(timer)
timer=null
fn.apply(that,arguments)
},interval||1000);
}
}
                            
查看完整回答
反对 回复 2019-05-12
?
RISEBY

TA贡献1856条经验 获得超5个赞

arguments是当前函数被调用时传入的参数,这个是特殊的内建参数,换个方法块它的值就不一样了,所以用varargs=arguments来拷贝一份当前函数被调用时的参数。
varthat=this同样是拷贝一份当前的上下文,或者说this指向。
这两行代码是为了下面定时器内调用所做的一次拷贝,这涉及到this指向、作用域等等一系列知识点。
                            
查看完整回答
反对 回复 2019-05-12
  • 2 回答
  • 0 关注
  • 646 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信