我从"动手节点"中采用了以下示例。它使用了一些相当先进的技术。我已逐字复制了代码并试图调试几次,但无法弄清楚为什么没有任何内容打印到我的控制台。
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);
})();
答案 0 :(得分: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
传递给初始.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
})();
答案 1 :(得分:1)
'schedule'函数返回的匿名中的'start'函数有一个拼写错误 - 它应该使用参数“timeout”调用“setTimeout”,而不是“setTimeout”:
var schedule = function(timeout, callbackfunction) {
return {
start: function() {
setTimeout(callbackfunction, timeout); // Fix the second arg.
}
}
};
此外,“doStart()”函数调用再也不会调用匿名“start()”函数,因此log语句只会执行一次。