闭包到底是什么鬼
闭包就是函数��,但是它可以继承并访问它自身被声明的那个作用域里的变量。当你将一个回调函数作为参数传递给另外一个进行i/o操作的函数时,回调函数稍后会被调用,神奇的是,在被调用时,回调函数会记住它自身声明时所在的上下文,并且可以访问该上下文及其父上下文里的所有变量,这个强大的特性就是Node成功的核心。
举个简单的jquery例子:
(function(){
var clickCount=0;
$('button#mybutton').on('click',function(){
clickCount++;
alert('Clicked '+clickCount+' times.');
});
})();
用闭包的另一个好处是防止变量污染全局空间。
闭包如何辅助异步编程
在进行事件驱动编程时,从定义事件发生时执行的代码开始,然后将代码放入一个函数当中,最后将该函数作为一个参数进行传递以备稍后调用。
在JavaScipt中,函数操作并不是孤立地工作而是会记住它被什么时所在的上下文,这能让函数操作其声明时所在的上下文以及父上下文中所在的所有变量。
当你将回调函数作为参数进行传递时,它会在稍微某个时刻被调用,但即使声明回调函数的那个作用域已经返回,回调函数依然可以操作该作用域或者父作用域中的任意变量,在上述最后一个例子中,虽然回调函数时在jquery的click函数内部被调用,但是它依然可以访问或者操作clickCount变量。
这显示 应用闭包模式,可以从两方面获得极大好处:
1. 可以通过将状态变量传递给函数而不必维护它就可以进行事件驱动编程
2. JavaScript的闭包会为你维护状态变量