javascipt闭包可以记录函数的作用域,并且闭包内的变量不会被外面所污染,javascipt的函数执行时都会在定义它的上下文环境中执行,用好以上两点可以解决一些异步操作,或是绑定点击事件时的小问题。
现在有这样一个需求,看代码,很简单:1
2
3
4
5
6
7var x =['a','b','c'];
for(var i=0;i<x.length;i++){
var xi=x[i]
setTimeout(function(){
alert(xi)
},2000*(i+1))
}
每隔两秒钟,输出这个数组内的一个元素。但是上述代码运行后,会每隔两秒输出一个‘c’字,而不会根据数组X的顺序,‘a’,’b’,’c’这样输出。原因很简单,因为setTimeout内的函数没有马上执行,而当执行时,函数上下文的xi已经变为’c’了。
那如何才能达到我们的预期呢?我们只需要引入一个闭包,让setTimeout函数在闭包内运行就可以了,看代码:
1 | var x =['a','b','c']; |
在循环中加入一个y的闭包,这样就可以每隔2秒钟按X数组的顺序输出:’a’,’b’,’c’了。在setTimeout执行完毕后,y函数会被自动垃圾回收,即环保,又轻巧,对于按数组顺序绑定或是node.js的一些根据数组存放的ID去数据库查数据等一些异步操作都可以这样来搞定。
当然也可以用之前编写的:ajax队列、ajax并发管理插件 - AsyncProxy_browser.js来进行管理。