2

嘿伙计们,我是一个新人,试图找出一些令人困惑的方法

    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');} 

作为之前没有接受参数时的参数..!

多谢你们

4

3 回答 3

0

delay设置为由立即执行的函数返回的函数 (function(){ …return function()... })(); 立即执行一个的函数,也会在 timer 变量周围创建闭包。

功能(){ … })(); 不完全是一个window.ready。相反,它在任何地方执行。注意()最后的。它返回另一个函数,该函数保存在可变延迟内。

然后在输入键上 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
      };
于 2013-04-03T17:26:28.487 回答
0

函数只是将多行代码包装在一起的一种方式。

你可以让它匿名并立即执行:

     (function (){ alert("I'm working!");})();

然后,您可以给它起一个名称,例如:

     function myFunction(){ alert("I'm working!");}

你可以调用它:

     myFunction();

你可以做

     $("input").keyup(function() {
         delay( myFunction, 1000 );
     });

一旦在输入输入时抬起一个键,它将在 1000 毫秒后运行 myFunction。

于 2013-04-03T17:11:03.317 回答
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(); 
于 2013-04-03T17:20:15.303 回答