我试图理解这个示例代码,什么是第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.
…为什么开始(超时)?
在这个例子中,实际上没有理由将timeout
传递给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();
}
})();
函数调度作为函数执行。该函数返回一个对象。就像你可以看到的{ start... }
。对于返回的对象,它调用start
函数。这叫做连锁反应。所以start
函数是在设置函数之后执行的。
奇怪的是,超时被传递给没有参数的start
函数