为什么以下JavaScript函数不能打印任何内容?

时间:2012-01-31 18:59:58

标签: javascript node.js

我从"动手节点"中采用了以下示例。它使用了一些相当先进的技术。我已逐字复制了代码并试图调试几次,但无法弄清楚为什么没有任何内容打印到我的控制台。

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);
})();

2 个答案:

答案 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()函数确实引用了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 :(得分:1)

'schedule'函数返回的匿名中的'start'函数有一个拼写错误 - 它应该使用参数“timeout”调用“setTimeout”,而不是“setTimeout”:

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

此外,“doStart()”函数调用再也不会调用匿名“start()”函数,因此log语句只会执行一次。