2012-01-31 89 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()”函数调用不会再调用匿名“开始()”功能,所以日志语句只会执行一次。

相关问题