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

...为什么开始(超时)?

在该示例中,实际上没有理由传递timeoutinto start,因为start不接受或使用任何参数。电话也可以.start()

发生的事情是schedule 返回schedule函数创建的对象,并且该对象的属性之一被调用start,它是一个函数。当被调用时,它通过使用传入的原始超时和传入的回调函数start来设置定时回调。setTimeoutscheduleschedule

代码调用schedule转身并立即调用start它创建的对象上的函数。

在评论中,Pointy 指出(好吧,他会,不是吗?)回调函数正在调用schedule,但没有对返回的对象做任何事情,这是没有意义的——schedule除了创建和返回对象之外什么都不做,因此不使用返回的对象会使调用毫无意义。

这是解决这两个问题的代码:

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 回答