2012-04-08 44 views
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毫秒,但我不明白是怎么回事,谢谢:)

+0

我建议你问一下http://codereview.stackexchange.com/ – Gerep 2012-04-08 22:36:25

+0

看看['clearTimeout'](https://developer.mozilla.org/en/DOM/window.clearTimeout)和[ 'setTimeout'](https://developer.mozilla.org/en/DOM/window.setTimeout)。 – 2012-04-08 22:37:16

+1

你可能也想看看匿名函数的定义。这里是[链接](http://stackoverflow.com/questions/1140089/how-does-an-anonymous-function-in-javascript-work)。 – DiamRem 2012-04-08 22:44:03

回答

6

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

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。

+0

谢谢。这帮助了我很多! – cgwebprojects 2012-04-09 14:05:29

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)来调用该内部函数。

在第一块代码
0

ü使一个变量,它是延迟并分配如果给函数的返回值..其又返回一个函数,它是

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

所以这是actly乌尔延迟变化。 NW 所以当u这样称呼它..

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

这WUD按预期..
也注意到()在其中u assing的delay变量结束..这在javascript意味着运行功能一旦它遇到..所以当我看到它的代码的第一部分运行,并且delay变量被分配了一个函数..你在第二段代码中调用