2013-04-03 64 views
2

嗨我是一个新来的家伙试图找出一些方法,这是令人困惑的(function(){..........});工作

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(){alert('works');} 

的参数时,没有参数是之前接受..!

谢谢你们

+0

您是否想了解匿名函数是什么? – danielrsmith

+0

这可能有所帮助 - http://en.wikipedia.org/wiki/Anonymous_function – Jordan

+0

不.....我可以理解,我的意思是(功能(){是像window.ready? – Anup

回答

0

功能只是一种方式来包装许多行代码在一起。

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

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

然后,您可以把它像一个名字:

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

,你可以把它叫做:

 myFunction(); 

你可以做

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

并且一旦在输入中输入键时抬起一个键,它将在1000ms后运行myFunction。

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(); 
0

delay被设定为通过立即执行函数返回的功能(功能(){...返回功能().. 。})();立即执行一个的函数也会在计时器变量周围创建闭包。 (function(){...})();(函数(){...})();不完全是一个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 
     }; 
相关问题