...为什么开始(超时)?
在该示例中,实际上没有理由传递timeout
into start
,因为start
不接受或使用任何参数。电话也可以.start()
。
发生的事情是schedule
返回该schedule
函数创建的对象,并且该对象的属性之一被调用start
,它是一个函数。当被调用时,它通过使用传入的原始超时和传入的回调函数start
来设置定时回调。setTimeout
schedule
schedule
代码调用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();
}
})();