...なぜ開始(タイムアウト)するのですか?
この例では、は引数を受け入れたり使用したりしないtimeout
ため、 に渡す理由は実際にはありません。呼び出しは.start
start
.start()
何が起こっているかというと、関数が作成するオブジェクトをschedule
返しschedule
、そのオブジェクトのプロパティの 1 つが呼び出されstart
、これが関数です。がstart
呼び出されると、 に渡された元のタイムアウトと に渡されたコールバック関数をsetTimeout
使用して、時間指定されたコールバックが設定されます。schedule
schedule
コードの呼び出しは反転し、作成したオブジェクトschedule
の関数をすぐに呼び出します。start
schedule
コメントの中で、Pointy は、コールバック関数が呼び出しているが、返されたオブジェクトに対して何もしていないことschedule
を指摘しています (そうでしたか?)。であるため、返されたオブジェクトを使用しないと、呼び出しが無意味になります。
これら 2 つの問題に対処したコードを次に示します。
var schedule = function (timeout, callbackfunction) {
return {
start: function () {
setTimeout(callbackfunction, timeout)
}
};
};
(function () {
var timeout = 1000; // 1 second
var count = 0;
schedule(timeout, function doStuff() {
console.log(++count);
schedule(timeout, doStuff).start(); // <== Change here
}).start(); // <== And here
})();
ただし、率直に言って、修正を行ったとしても、あまり良いコードではありません。毎回新しいオブジェクトを作成する特に正当な理由はありません。率直に言って、この本が教育を意図しているのであれば、この例はより明確になる可能性があります。関数によって返されるオブジェクトの名前付き関数式とメソッドの呼び出しをインライン化します...絶対に問題ありませんが、教育用ではありません。それでも、文脈がわからないので、それらのコメントには塩分が含まれています。
これは、関数が返すオブジェクトを再利用schedule
することで、関数を使用することの作り直されたバージョンです。
(function () {
var timeout = 1000; // 1 second
var count = 0;
// Create the schedule object
var scheduleObject = schedule(timeout, doStuff);
// Set up the first timed callback
scheduleObject.start();
// This is called by each timed callback
function doStuff() {
// Show the count
console.log(++count);
// Set up the next timed callback
scheduleObject.start();
}
})();