ÐаÑÑимÑÑÑий декоÑаÑоÑ
СÑвоÑÑÑÑ Ð´ÐµÐºÐ¾ÑаÑÐ¾Ñ delay(f, ms), Ñка заÑÑимÑÑ ÐºÐ¾Ð¶ÐµÐ½ виклик f на ms мÑлÑÑекÑнд.
ÐапÑиклад:
function f(x) {
alert(x);
}
// ÑÑвоÑÑÑмо обгоÑÑки
let f1000 = delay(f, 1000);
let f1500 = delay(f, 1500);
f1000("ÑеÑÑ"); // показÑÑ "test" пÑÑÐ»Ñ 1000 мÑ
f1500("ÑеÑÑ"); // показÑÑ "test" пÑÑÐ»Ñ 1500 мÑ
ÐнÑими Ñловами, delay(f, ms) повеÑÑÐ°Ñ Ð²Ð°ÑÑÐ°Ð½Ñ f з âзаÑÑÐ¸Ð¼ÐºÐ¾Ñ Ð½Ð° msâ.
У ÐºÐ¾Ð´Ñ Ð²Ð¸Ñе, ÑÑнкÑÑÑ f пÑÐ¸Ð¹Ð¼Ð°Ñ Ð»Ð¸Ñе один аÑгÑменÑ, але ваÑе ÑÑÑÐµÐ½Ð½Ñ Ð¿Ð¾Ð²Ð¸Ð½Ð½Ð¾ пеÑедаваÑи вÑÑ Ð°ÑгÑменÑи Ñа конÑекÑÑ this.
Ð ÑÑеннÑ:
function delay(f, ms) {
return function() {
setTimeout(() => f.apply(this, arguments), ms);
};
}
let f1000 = delay(alert, 1000);
f1000("ÑеÑÑ"); // показÑÑ "ÑеÑÑ" пÑÑÐ»Ñ 1000 мÑ
ÐвеÑнÑÑÑ ÑвагÑ, Ñк ÑÑÑ Ð²Ð¸ÐºÐ¾ÑиÑÑовÑÑÑÑÑÑ ÑÑÑÑлоÑна ÑÑнкÑÑÑ. Як вÑдомо, ÑÑÑÑлоÑÐ½Ñ ÑÑнкÑÑÑ Ð½Ðµ маÑÑÑ Ð²Ð»Ð°ÑниÑ
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);
};
}
ÐÑдкÑиÑи ÑÑÑÐµÐ½Ð½Ñ Ñз ÑеÑÑами в пÑÑоÑниÑÑ.