如何(function(){..........});作品

时间:2013-04-03 16:51:07

标签: jquery-ui jquery

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

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

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

谢谢你们

3 个答案:

答案 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调用关闭定时器变量的匿名函数,并返回第二个匿名函数,它接受两个参数callbackms(因此,类型为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
      };