为什么下面的JavaScript函数不打印任何东西?
我从“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);
})();
除了通过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
})();
对。 'setInterval'任何人? – 2012-01-31 19:10:22
在匿名由“日程”函数返回的“开始”功能有一个错字 - 它应该叫“的setTimeout”的说法“超时”,而不是“的setTimeout”:
var schedule = function(timeout, callbackfunction) {
return {
start: function() {
setTimeout(callbackfunction, timeout); // Fix the second arg.
}
}
};
此外,“DOSTART()”函数调用不会再调用匿名“开始()”功能,所以日志语句只会执行一次。
我相信你在你的代码中有一个错字,在:setTimeout(callbackfunction,setTimeout)中,第二个参数应该是“timeout” – ggreiner 2012-01-31 19:02:06
嗯,我推荐使用比本书其他学习资源... – maerics 2012-01-31 19:16:41