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