ÐадеÑживаÑÑий декоÑаÑоÑ
СоздайÑе декоÑаÑÐ¾Ñ delay(f, ms), коÑоÑÑй задеÑÐ¶Ð¸Ð²Ð°ÐµÑ ÐºÐ°Ð¶Ð´Ñй вÑзов f на ms миллиÑекÑнд.
ÐапÑимеÑ:
function f(x) {
alert(x);
}
// ÑоздаÑм обÑÑÑки
let f1000 = delay(f, 1000);
let f1500 = delay(f, 1500);
f1000("test"); // показÑÐ²Ð°ÐµÑ "test" поÑле 1000 мÑ
f1500("test"); // показÑÐ²Ð°ÐµÑ "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("test"); // показÑÐ²Ð°ÐµÑ "test" поÑле 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);
};
}
ÐÑкÑÑÑÑ ÑеÑение Ñ ÑеÑÑами в пеÑоÑниÑе.