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

前端攻城师 郭培的博客

Be the best you can

 
 
 

日志

 
 
关于我

前端技术:http://hszy00232.blog.163.com/ 前端设计:http://blog.sina.com.cn/hsjs00232 职业:web前端工程师 现居地:北京 My QQ:365246295 Mail:hszy00232@163.com

网易考拉推荐

javascript - 闭包  

2013-02-18 11:35:19|  分类: javascript |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
在学习javascript过程中,闭包是个很重要的概念,也是不容易说清的一个概念。在这里把自己关于闭包的理解整理下来。

何为闭包

闭包常见的形式,就是一个函数内部创建另一个函数,其中子函数可以访问父函数中定义的变量,传的参数等,而父函数则不能访问子函数其中的这些项。

如:

function parent(propertyname){

alert(obj1); // error
return function(obj1,obj2){
var value1 = obj1[propertyname];
var value2 = obj2[propertyname];
if(value1 < value2){
return -1;
}else if(value1 > value2){
return 1;
}else{
return 0;
}
};
}

在函数parent中包含一个匿名的子函数,在子函数中是可以访问propertyname的值,但是在parent中无法访问子函数中的obj1,obj2。

使用闭包时需要注意

1.闭包只能取得包含函数(即父函数)中变量的最后一个值

function ofun(){
var result = [];
for(var i = 0; i < 5; i++){
result[i] = function(){
return i;
};
}
return result[0]; //取result[0]内容
}
alert(ofun()()); //result[0]返回5,而不是预想的0;

在上面的例子中

function(){
return i;
}

返回的i值并非for循环中的[0,1,2,3,4];而是返回[5,5,5,5,5]。这是因为当该函数执行时(即ofun()()时),for循环已执行完毕,i已变以5。

理解:
在javascript中没有块级作用域的概念,在其他类C的语言中,由花括号封闭的代码块都有自己的作用域,但javascript不是这样。这意味着在块语名中定义的变量,实际上是在包含函数中而非语句中创建的。
for循环中定义的变量i与在ofun()里直接定义var i 是一样的,都是函数ofun内部随处可以访问它。
通过重新声明变量i的值,验证内部匿名函数执行时i的取值。

function ofun(){
var result = [];
for(var i = 0; i < 5; i++){
result[i] = function(){
return i;
};
}
var i = "test"; //重新声明变量i的值
return result[0]; //取result[0]内容
}
alert(ofun()()); //test

为了实现其他语言块作用域的概念,在javascript中可以通过函数表达式来实现

(function(){
return i;
})();

(function(){
return i;
}());

result[i] = function(){
return i;
}();

如果想让ofun返回[0,1,2,3,4],我们把代码改动如下:

function ofun(){
var result = [];
for(var i = 0; i < 5; i++){
result[i] = function(){
return i;
}();
}
var i = "test"; //重新声明变量i的值
return result; //取result内容
}
alert(ofun()); //[0,1,2,3,4]


2.在IE9之前的版本中使用闭包要注意内存的泄漏问题

在使用闭包时经常会说到内存的泄漏问题,为什么闭包会存在这个风险。待补充


  评论这张
 
阅读(626)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

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

页脚

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