2

このサンプルコードを理解しようとしています.15行目の機能は何ですか?なぜstart(timeout)ですか? (すみません、プログラミング初心者です)

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(timeout);
})();

// "timeout" and "count" variables
 // do not exist in this scope.
4

2 に答える 2

3

...なぜ開始(タイムアウト)するのですか?

この例では、は引数を受け入れたり使用したりしないtimeoutため、 に渡す理由は実際にはありません。呼び出しは.startstart.start()

何が起こっているかというと、関数が作成するオブジェクトをschedule 返しschedule、そのオブジェクトのプロパティの 1 つが呼び出されstart、これが関数です。がstart呼び出されると、 に渡された元のタイムアウトと に渡されたコールバック関数をsetTimeout使用して、時間指定されたコールバックが設定されます。scheduleschedule

コードの呼び出しは反転し、作成したオブジェクト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();
    }
})();
于 2013-03-09T16:41:22.500 に答える
2

機能スケジュールは機能として実行されます。その関数はオブジェクトを返します。あなたがで見ることができるように{ start... }。返されたオブジェクトを使用して、start関数を呼び出します。これは連鎖と呼ばれます。したがって、start関数は、関数が設定された後に実行されます。

start奇妙なのは、パラメータを持たない関数にタイムアウトが渡されることです。

于 2013-03-09T16:40:10.593 に答える