Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript自调用函数_Javascript_Function_Timeout - Fatal编程技术网

JavaScript自调用函数

JavaScript自调用函数,javascript,function,timeout,Javascript,Function,Timeout,我试图理解这个示例代码,第15行的功能是什么,为什么启动(超时)?(对不起,我是编程新手) 函数计划作为函数执行。该函数返回一个对象。就像您可以通过{start…}看到的那样。对于返回的对象,它调用start函数。这就是所谓的链接。因此,start功能在设置该功能后执行 奇怪的是,超时被传递到没有参数的start函数 …为什么启动(超时) 在该示例中,实际上没有理由将timeout传递到start,因为start不接受或使用任何参数。调用也可以是.start() 发生的情况是,schedule返

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


函数计划作为函数执行。该函数返回一个对象。就像您可以通过
{start…}
看到的那样。对于返回的对象,它调用
start
函数。这就是所谓的链接。因此,
start
功能在设置该功能后执行

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

…为什么启动(超时)

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

发生的情况是,
schedule
返回一个由
schedule
函数创建的对象,该对象上的一个属性称为
start
,这是一个函数。调用
start
时,它使用传递到
schedule
的原始超时和传递到
schedule
的回调函数,通过
setTimeout
设置定时回调

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

该代码可能会引起混淆-调用
.start()
时传递的参数被该函数忽略。是否收到范围错误?如果是,那是因为您在函数中声明了timeout和count,而它们在所述函数之外不可用。实际上,这在其他方面是错误的。它来自哪里?此示例代码来自Pedro的HANDS ON NODEJS一书Teixeira@user1477955:您是否绝对确定示例与上面所示完全相同?如果是这样的话,那么这本书就完全没有反映出来。同样奇怪的是,在回调中,调用了“schedule()”函数,但这是毫无意义的,因为它的返回值只是这些对象中的另一个;换句话说,没有对“.start()”的调用。非常感谢!您的代码更容易理解,谢谢您的解释。@user1477955:我很高兴这对您有所帮助。
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
})();
(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();
    }
})();