å»¶æ¶è£ 饰å¨
éè¦ç¨åº¦: 5
å建ä¸ä¸ªè£
é¥°å¨ delay(f, ms)ï¼è¯¥è£
饰å¨å° f çæ¯æ¬¡è°ç¨å»¶æ¶ ms 毫ç§ã
ä¾å¦ï¼
function f(x) {
alert(x);
}
// create wrappers
let f1000 = delay(f, 1000);
let f1500 = delay(f, 1500);
f1000("test"); // å¨ 1000ms åæ¾ç¤º "test"
f1500("test"); // å¨ 1500ms åæ¾ç¤º "test"
æ¢å¥è¯è¯´ï¼delay(f, ms) è¿åçæ¯å»¶è¿ ms åç f çåä½ã
å¨ä¸é¢ç代ç ä¸ï¼f æ¯åä¸ªåæ°ç彿°ï¼ä½æ¯ä½ çè§£å³æ¹æ¡åºè¯¥ä¼ éææåæ°åä¸ä¸æ thisã
è§£å³æ¹æ¡ï¼
function delay(f, ms) {
return function() {
setTimeout(() => f.apply(this, arguments), ms);
};
}
let f1000 = delay(alert, 1000);
f1000("test"); // shows "test" after 1000ms
注æè¿éæ¯å¦ä½ä½¿ç¨ç®å¤´å½æ°çãæä»¬ç¥éï¼ç®å¤´å½æ°æ²¡æèªå·±ç this å argumentsï¼æä»¥ f.apply(this, arguments) ä»å
è£
å¨ä¸è·å this å argumentsã
妿æä»¬ä¼ éä¸ä¸ªå¸¸è§å½æ°ï¼setTimeout å°è°ç¨å®ä¸ä¸å¸¦åæ°ï¼å¹¶ä¸ this=windowï¼å设æä»¬å¨æµè§å¨ç¯å¢ï¼ã
æä»¬ä»ç¶å¯ä»¥éè¿ä½¿ç¨ä¸é´åéæ¥ä¼ éæ£ç¡®ç thisï¼ä½è¿æç¹éº»ç¦ï¼
function delay(f, ms) {
return function(...args) {
let savedThis = this; // å° this åå¨å°ä¸é´åé
setTimeout(function() {
f.apply(savedThis, args); // å¨è¿å¿ä½¿ç¨å®
}, ms);
};
}