5

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

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 毫秒,但我不明白发生了什么谢谢 :)

4

3 回答 3

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,因为第一个代码将覆盖 timer 变量。

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

于 2012-04-08T22:44:10.937 回答
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) {...访问局部变量的函数 () timertimer就任何外部代码而言,该变量是不可见的。只有delay包含的函数才能访问它。

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

于 2012-04-08T22:39:34.133 回答
0

在第一段代码中,你创建了一个延迟变量,并将 if 分配给函数的返回值。这反过来又返回了一个函数,该函数是

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

所以这实际上是你的延迟变量。nw 所以当你这样称呼它时

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

这个 wud 可以按预期工作..
还要注意()最后你在哪里 assingdelay变量.. 在 javascript 中意味着一旦遇到它就运行一个函数.. 所以当我看到它的第一部分代码运行时delay变量被分配了一个函数..你在第二段代码中调用它

于 2012-04-08T22:39:49.260 回答