这个“延迟”功能如何工作

时间:2012-04-08 22:32:12

标签: javascript

我正在使用此代码来包装部分代码,就像这样使用

var delay = (function() {
    // SET TIMER
    var timer = 0;
    // RETURN SET TIMEOUT FUNCTION
    return function(callback, ms) {
        clearTimeout(timer);
        timer = setTimeout(callback, ms);
    };
})();​

我这样称呼,

delay(function() {
     .......
}, 1000);

它会延迟1000毫秒,但我不明白发生了什么,谢谢:)

3 个答案:

答案 0 :(得分:7)

延迟是一个返回另一个函数的函数。定时器变量位于延迟函数的闭包内,因此它仍然可以被返回函数接收。功能。你也可以像这样写

var delay;
var timer = 0;
delay = function(callback, ms) {
    clearTimeOut(timer);
    timer = setTimeout(callback, ms);
}

现在的问题是,如果你调用延迟两次,它将覆盖定时器变量,因此第二个延迟将覆盖定时器变量。我测试了这个,似乎你的功能也被打破了它应该是:

var delay = function(){
// SET TIMER
    var timer = 0;
// RETURN SET TIMEOUT FUNCTION
    return function(callback, ms){
        clearTimeout(timer);
        timer = setTimeout(callback, ms);
    };
};

delay()(function(){console.log("hello1");}, 5000);
delay()(function(){console.log("hello2");}, 5000);

如果您的代码相同,它只会跟踪hello2,因为第一个会覆盖定时器变量。

除非您的意图是第二次延迟将停止第一次延迟,否则您应该使用不同的approuch。

答案 1 :(得分:2)

这段代码的第一件事就是执行这个函数(感谢你发布的代码最后的()):

function() {
    // SET TIMER
    var timer = 0;
    // RETURN SET TIMEOUT FUNCTION
    return function(callback, ms) {
        clearTimeout(timer);
        timer = setTimeout(callback, ms);
    };
}​

并将结果存储在delay中。执行时,此函数创建一个闭包,其局部变量timer将作为本地计数器进行切换。然后该函数返回内部函数:

function(callback, ms) {
   clearTimeout(timer);
   timer = setTimeout(callback, ms);
}

由于它处于闭包状态,因此该内部函数可以访问timer变量。没有其他外部代码可以访问timer。此方法用于允许多个计时器一次运行,而不必担心多个timer变量。

想象一下:delay现在包含一个可以访问局部变量function(callback, ms) {...的函数(timer)。就任何外部代码而言,变量timer是不可见的。只有delay包含的函数才能访问它。

然后通过调用delay(callback, timeout)来调用该内部函数。

答案 2 :(得分:0)

在第一段代码中,你创建一个延迟变量,并将if赋值给函数的返回值..这又返回一个函数

return function(callback, ms) {
        clearTimeout(timer);
        timer = setTimeout(callback, ms);
    }

所以这是你的延迟变量。 NW 所以,当你把它称为..

delay(function() {
     .......
}, 1000);

这个wud按预期工作..
还注意到()在你给delay变量的那一端...在javascript中意味着一旦遇到就运行一个函数..所以当我看到代码的第一部分时运行并为delay变量分配一个函数..你在第二段代码中调用