注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

snoopyxdy的博客

https://github.com/DoubleSpout

 
 
 

日志

 
 

javascript闭包应用小实例  

2011-10-25 13:39:10|  分类: web前端技术 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
javascipt闭包可以记录函数的作用域,并且闭包内的变量不会被外面所污染,javascipt的函数执行时都会在定义它的上下文环境中执行,用好以上两点可以解决一些异步操作,或是绑定点击事件时的小问题。

现在有这样一个需求,看代码,很简单:
var 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函数在闭包内运行就可以了,看代码:

var x =['a','b','c'];
for(var i=0;i<x.length;i++){
var xi=x[i]
var y = function(xi){
    setTimeout(function(){
        alert(xi)
    },2000*(i+1))
}(xi)
}


在循环中加入一个y的闭包,这样就可以每隔2秒钟按X数组的顺序输出:'a','b','c'了。在setTimeout执行完毕后,y函数会被自动垃圾回收,即环保,又轻巧,对于按数组顺序绑定或是node.js的一些根据数组存放的ID去数据库查数据等一些异步操作都可以这样来搞定。
当然也可以用之前编写的:ajax队列、ajax并发管理插件 - AsyncProxy_browser.js来进行管理。
地址:http://snoopyxdy.blog.163.com/blog/static/6011744020119131224221/
  评论这张
 
阅读(1665)| 评论(1)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016