JavaScript自调用函数



我试图理解这个示例代码,什么是第15行的功能,为什么是start(timeout) ?(对不起,我是编程新手)

var schedule = function (timeout, callbackfunction) {
    return {
        start: function () {
            setTimeout(callbackfunction, timeout)
        }
    };
};
(function () {
    var timeout = 1000; // 1 second
    var count = 0;
    schedule(timeout, function doStuff() {
        console.log(++count);
        schedule(timeout, doStuff);
    }).start(timeout);
})();
// "timeout" and "count" variables
 // do not exist in this scope.

…为什么开始(超时)?

在这个例子中,实际上没有理由将timeout传递给start,因为start不接受或使用任何参数。调用也可以是.start()

发生的是schedule 返回一个schedule函数创建的对象,并且该对象的一个属性称为start,这是一个函数。当start被调用时,它通过setTimeout建立一个定时回调,使用传入schedule原始超时和传入schedule的回调函数。

调用schedule的代码转过来,立即在它创建的对象上调用start函数。

在评论中,Pointy指出(好吧,他会,不是吗?)回调函数调用schedule,但没有对返回的对象做任何事情,这是毫无意义的 —schedule除了创建和返回对象之外不做任何事情,因此不使用返回的对象使调用变得毫无意义。

下面的代码解决了这两个问题:

var schedule = function (timeout, callbackfunction) {
    return {
        start: function () {
            setTimeout(callbackfunction, timeout)
        }
    };
};
(function () {
    var timeout = 1000; // 1 second
    var count = 0;
    schedule(timeout, function doStuff() {
        console.log(++count);
        schedule(timeout, doStuff).start(); // <== Change here
    }).start();                             // <== And here
})();

这不是很好的代码,虽然,坦率地说,即使有修复。每次都创建一个新对象没有特别好的理由,坦率地说,如果这本书是为了教学,这个例子可能会更清楚。内联命名函数表达式和调用函数返回的对象的方法…当然可以,但不适合教学。不过,我不知道上下文,所以这些评论是有保留的。

这是使用schedule函数的修改版本,通过重用返回的对象,并清楚地知道当:

(function () {
    var timeout = 1000; // 1 second
    var count = 0;
    // Create the schedule object
    var scheduleObject = schedule(timeout, doStuff);
    // Set up the first timed callback
    scheduleObject.start();
    // This is called by each timed callback
    function doStuff() {
        // Show the count
        console.log(++count);
        // Set up the next timed callback
        scheduleObject.start();
    }
})();

函数调度作为函数执行。该函数返回一个对象。就像你可以看到的{ start... }。对于返回的对象,它调用start函数。这叫做连锁反应。所以start函数是在设置函数之后执行的。

奇怪的是,超时被传递给没有参数的start函数

相关内容

  • 没有找到相关文章

最新更新