嘿伙计们,我是一个试图找出令人困惑的方法的新人
var delay = (function(){
var timer = 0;
return function(callback, ms){
clearTimeout (timer);
timer = setTimeout(callback, ms);
};
})();
这是我发现的一段代码,它像
一样使用$("input").keyup(function() {
delay(function(){
alert('works');
}, 1000 );
});
我知道上面的代码可以运行,因为我测试了它,但我不明白究竟是什么(function(){的意思,以及回调如何具有
function(){alert('works');}
作为没有参数被接受之前的参数..!
谢谢你们
答案 0 :(得分:0)
函数只是将多行代码包装在一起的一种方法。
您可以匿名并立即执行:
(function (){ alert("I'm working!");})();
然后你可以给它起一个名字:
function myFunction(){ alert("I'm working!");}
你可以用:
来调用它 myFunction();
你可以做到
$("input").keyup(function() {
delay( myFunction, 1000 );
});
并且在输入输入键时,一旦键被抬起,它将在1000ms后运行myFunction。
答案 1 :(得分:0)
分配给delay
调用关闭定时器变量的匿名函数,并返回第二个匿名函数,它接受两个参数callback
和ms
(因此,类型为delay
也是两个参数的函数),它清除与timer
变量关联的句柄,然后调用回调。如果您有一些调用延迟比超时更快的内容,并且您只想响应最近的呼叫,则非常有用。
我们可以这样做(稍微)更清楚:
//define the closure
var closure = function() {
var timer = 0;
return function(callback, ms) {
clearTimeout (timer);
timer = setTimeout(callback, ms);
};
};
//invoke the closure to return the function that we will actually use as delay
var delay = closure();
答案 2 :(得分:0)
delay
设置为由立即执行的函数返回的函数(function(){... return function()...})();立即执行一个函数,也会在计时器变量周围创建闭包。
(function(){...})();并不完全是一个窗口。而是在任何地方执行它。请注意最后的()
。它返回另一个保持在可变延迟内的函数。
然后在输入键上1秒后显示警报,但是如果按下向上键几次在1秒内,则防止警报多次显示。用于取消使用clearTimeout
调用前一个计时器 $("input").keyup(function() {
delay(function(){
alert('works');
}, 1000 );
});
//delay takes 2 params callback and ms
//ms:1000
//set the callback as:
function(){
alert('works');
}
now delay invokes following code that has already created closure around timer var.
function(callback, ms){
clearTimeout (timer); //attempts to cancels previous timer event that would invoke alert callback
timer = setTimeout(callback, ms); //call back the above set callback after ms value i.e. 1000 milli seconds
};