JavaScript自调用功能

时间:2013-03-09 16:36:23

标签: javascript function timeout

我正在尝试理解这个示例代码,第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.

2 个答案:

答案 0 :(得分:3)

  

...为什么开始(超时)?

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

正在发生的事情是schedule 返回 schedule函数创建的对象,该对象上的一个属性称为start,这是一个功能。调用start后,它会使用传递到setTimeout原始超时通过schedule设置定时回调,并将回调函数传入schedule

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

在评论中,Pointy指出(好吧,他会,不是吗?)回调函数正在调用schedule但是没有对返回的对象做任何事情,这是毫无意义的 - {{1}除了创建和返回对象之外,它不会做任何事情,所以不使用返回的对象会使调用毫无意义。

以下是解决这两个问题的代码:

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

答案 1 :(得分:2)

功能计划作为功能执行。该函数返回一个对象。就像你可以看到{ start... }。使用返回的对象,它会调出start函数。这称为链接。因此在设置函数后执行start函数。

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