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)//下面的代码只会打印一次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
TA贡献1856条经验 获得超5个赞
arguments是当前函数被调用时传入的参数,这个是特殊的内建参数,换个方法块它的值就不一样了,所以用varargs=arguments来拷贝一份当前函数被调用时的参数。varthat=this同样是拷贝一份当前的上下文,或者说this指向。这两行代码是为了下面定时器内调用所做的一次拷贝,这涉及到this指向、作用域等等一系列知识点。
添加回答
举报
0/150
提交
取消