这个"延迟"功能如何工作

cgw*_*cts 5 javascript

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

var delay = (function() {
    // SET TIMER
    var timer = 0;
    // RETURN SET TIMEOUT FUNCTION
    return function(callback, ms) {
        clearTimeout(timer);
        timer = setTimeout(callback, ms);
    };
})();?
Run Code Online (Sandbox Code Playgroud)

我称之为,

delay(function() {
     .......
}, 1000);
Run Code Online (Sandbox Code Playgroud)

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

aut*_*coo 7

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

var delay;
var timer = 0;
delay = function(callback, ms) {
    clearTimeOut(timer);
    timer = setTimeout(callback, ms);
}
Run Code Online (Sandbox Code Playgroud)

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

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);
Run Code Online (Sandbox Code Playgroud)

如果您的代码执行相同操作,它将只跟踪hello2,因为第一个将覆盖timer变量.

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