亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

看了別人實現的節流代碼,十分不理解這個閉包里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 關注
  • 668 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號