遅延デコレータ
重要性: 5
f
の各呼び出し毎に ms
ミリ秒遅延をするデコレータ delay(f, ms)
を作成してください。
例:
function f(x) {
alert(x);
}
// ラッパーを作成
let f1000 = delay(f, 1000);
let f1500 = delay(f, 1500);
f1000("test"); // "test" は 1000ms 後に表示
f1500("test"); // "test" は 1500ms 後に表示
つまり、delay(f, ms)
“ms
遅延した” f
のバリアントを返します。
上のコードにおいて、f
は単一引数の関数ですが、あなたの解答はすべての引数とコンテキスト this
を渡すようにしてください。
解答:
function delay(f, ms) {
return function() {
setTimeout(() => f.apply(this, arguments), ms);
};
}
ここで、アロー関数がどう使われているか注意してください。ご存知の通り、アロー関数は独自の this
や arguments
を持ちません。なので、f.apply(this, arguments)
はラッパーから this
と arguments
を取ります。
もし、通常の関数を渡す場合、setTimeout
はそれを引数なしで、 this=window
(ブラウザの場合) で呼び出します。なので、ラッパーからそれらを渡すようにコードを書く必要があります。:
function delay(f, ms) {
// setTimeout の中で、ラッパーから this と 引数を渡すための変数を追加
return function(...args) {
let savedThis = this;
setTimeout(function() {
f.apply(savedThis, args);
}, ms);
};
}
function delay(f, ms) {
return function() {
setTimeout(() => f.apply(this, arguments), ms);
};
};