我正在使用此代码来包装部分代码,就像这样使用
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 :(得分: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
变量分配一个函数..你在第二段代码中调用