为什么下面的JavaScript函数不打印任何内容

Why does the following JavaScript function not print anything?

本文关键字:打印 任何内 函数 JavaScript 为什么      更新时间:2023-09-26

我从"Hands-on Node"中获得了以下示例。它使用了一些相当先进的技术。我已经逐字逐句地复制了代码,并尝试调试了几次,但不明白为什么没有任何东西打印到我的控制台上。

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传给最初的.start()。该函数不使用传递的任何参数。我更新以删除它。


如果这是为了教授闭包的好处,那么这个例子真的没有什么作用。

是的,.start()函数确实引用了timeoutcallbackfunction参数,但返回的对象被使用一次并丢弃,此时我们再次调用schedule,并向其传递相同的参数。

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

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

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

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