2012-01-31 111 views
0

我從「Hands-on Node」中選取了以下示例。它使用一些合理先進的技術。我已經逐字複製了代碼,並試圖調試幾次,但無法弄清爲什麼沒有打印到我的控制檯。爲什麼下面的JavaScript函數不打印任何東西?

var schedule = function(timeout, callbackfunction) { 
    return { 
     start: function() { 
      setTimeout(callbackfunction, setTimeout) 
     } 
    } 
}; 

(function() { 
    var timeout = 1000; 
    var count = 0; 
    schedule(timeout, function doStuff() { 
     console.log(++ count); 
     schedule(timeout, doStuff); 
    }).start(timeout); 
})(); 
+7

我相信你在你的代碼中有一個錯字,在:setTimeout(callbackfunction,setTimeout)中,第二個參數應該是「timeout」 – ggreiner 2012-01-31 19:02:06

+1

嗯,我推薦使用比本書其他學習資源... – maerics 2012-01-31 19:16:41

回答

4

除了通過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()功能確實引用了timeoutcallbackfunction參數,但返回的對象是使用一次並丟棄,在這一點上,我們再次呼籲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 
})(); 
+1

對。 'setInterval'任何人? – 2012-01-31 19:10:22

1

在匿名由「日程」函數返回的「開始」功能有一個錯字 - 它應該叫「的setTimeout」的說法「超時」,而不是「的setTimeout」:

var schedule = function(timeout, callbackfunction) { 
    return { 
    start: function() { 
     setTimeout(callbackfunction, timeout); // Fix the second arg. 
    } 
    } 
}; 

此外,「DOSTART()」函數調用不會再調用匿名「開始()」功能,所以日誌語句只會執行一次。