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

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=null
fn.apply(that,args)
},interval||1000);
}
}
哔哔one
浏览 647回答 2
2回答

12345678_0001

首先你要明白,throttle的功能是接受一个函数并返回一个新的函数,这个函数有节流的功能。用法会是这样:functionhandleClick(param){console.log('clicked',param)};constthrottledHandleClick=throttle(handleClick,2000)//下面的代码只会打印一次clickedthrottledHandleClick('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=nullfn.apply(that,arguments)},interval||1000);}}

RISEBY

arguments是当前函数被调用时传入的参数,这个是特殊的内建参数,换个方法块它的值就不一样了,所以用varargs=arguments来拷贝一份当前函数被调用时的参数。varthat=this同样是拷贝一份当前的上下文,或者说this指向。这两行代码是为了下面定时器内调用所做的一次拷贝,这涉及到this指向、作用域等等一系列知识点。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript