Javascript 这是怎么回事;延迟“;函数工作
我用这个代码来包装代码的一部分,它是这样使用的Javascript 这是怎么回事;延迟“;函数工作,javascript,Javascript,我用这个代码来包装代码的一部分,它是这样使用的 var delay = (function() { // SET TIMER var timer = 0; // RETURN SET TIMEOUT FUNCTION return function(callback, ms) { clearTimeout(timer); timer = setTimeout(callback, ms); }; })(); delay(f
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);
我这样叫它,
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毫秒,但我不明白发生了什么,谢谢:)这段代码要做的第一件事就是执行这个函数(感谢您发布的代码末尾的
()
):
并将结果存储在delay
中。执行此函数时,使用本地变量timer
创建一个闭包,该闭包作为本地计数器断开。然后,该函数返回内部函数:
function(callback, ms) {
clearTimeout(timer);
timer = setTimeout(callback, ms);
}
由于它处于关闭状态,因此该内部函数可以访问定时器
变量。没有其他外部代码可以访问计时器。此方法用于允许多个计时器同时运行,而不必担心多个计时器变量
想象一下:delay
现在包含一个函数(function(callback,ms){…
),该函数可以访问局部变量timer
。就任何外部代码而言,变量timer
是不可见的。只有delay
包含的函数才能访问它
然后在第一段代码中调用delay(callback,timeout)
调用该内部函数,生成一个为delay的变量,并将if赋值给函数的返回值..,该函数返回一个
return function(callback, ms) {
clearTimeout(timer);
timer = setTimeout(callback, ms);
}
这实际上是你的延迟变量
所以当你把它叫做
delay(function() {
.......
}, 1000);
此wud按预期工作。
还要注意()
在末尾,你分配了delay
变量。在javascript中,这意味着一遇到函数就立即运行。因此,当我看到的第一部分代码运行时,delay
变量被分配了一个函数。你在第二段代码中调用该函数时,延迟是一个返回另一个fu的函数n操作。计时器变量位于延迟函数的闭包内,因此返回函数仍然可以访问它。函数。您也可以这样编写它
var delay;
var timer = 0;
delay = function(callback, ms) {
clearTimeOut(timer);
timer = setTimeout(callback, ms);
}
您现在遇到的问题是,如果两次调用delay,它将覆盖计时器变量,因此第二次延迟将覆盖计时器变量。我对此进行了测试,似乎您的函数也被破坏了,应该是:
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,因为第一个将覆盖计时器变量
除非您的意图是第二次延迟将停止第一次延迟,否则您应该使用不同的方法。我建议您在上询问,看看和。您可能还想看看匿名函数定义。这是一个。谢谢。这对我帮助很大!