除了通過setTimeout
而不是timeout
(這將仍然允許它運行一次),如果這意味着循環定時器,然後有一個缺陷。
代碼在第一次後再也不會調用.start()
。你需要做到這一點...
(function() {
var timeout = 1000;
var count = 0;
schedule(timeout, function doStuff() {
console.log(++ count);
schedule(timeout, doStuff).start(); // Invoke .start() each time
}).start(); // Removed useless "timeout" argument
})();
我不知道爲什麼有人會採取這種方法,因爲它似乎過於複雜。
我什至不知道他們爲什麼經過timeout
到inital .start()
。該函數不使用任何傳遞的參數。我更新以刪除它。
如果這是爲了教授閉包的好處,那麼這個例子確實沒有什麼作用。
是的,.start()
功能確實引用了timeout
和callbackfunction
參數,但返回的對象是使用一次並丟棄,在這一點上,我們再次呼籲schedule
,並把它傳遞相同ARGS。
這似乎是一個展示更多有用的,如果schedule
剛剛返回的功能,你保留到函數的引用。然後它只需要撥打schedule
來保存這些值。
var schedule = function(timeout, callbackfunction) {
return function() {
setTimeout(callbackfunction, timeout)
}
};
(function() {
var count = 0;
var fn;
(fn = schedule(1000, function doStuff() { // 1. assign the function returned
console.log(++ count);
fn(); // 3. invoke the same function again
}))(); // 2. invoke the returned function immediately
})();
我相信你在你的代碼中有一個錯字,在:setTimeout(callbackfunction,setTimeout)中,第二個參數應該是「timeout」 – ggreiner 2012-01-31 19:02:06
嗯,我推薦使用比本書其他學習資源... – maerics 2012-01-31 19:16:41