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