javascript中闭包(Closure)详解


在javascript中,函数可看作是一种数据,可以赋值给变量,可以嵌套在另一个函数中。

var fun = function(){
  console.log("平底斜");
}

function fun(){
  var n=10;
  function son(){
    n++;
  }
  son();
  console.log(n);
}
fun(); //11
fun(); //11

我们把上面第二段代码稍微修改下:

var n=10;
function fun(){
  function son(){
    n++;
  }
  son();
  console.log(n);
}
fun(); //11
fun(); //12

看出差别了吗,如果理解不了代码执行结果,请看上一篇博文,关于javascript作用域和作用域链的讲解。

上面这段代码中变量n是全局变量,随时可能被重新赋值,而无需通过fun函数的调用。为了让变量n不受污染,或者说是减少全局变量的污染,我们需要把n放到函数中作为局部变量。

function fun(){
  var n=10;
  function son(){
    n++;
    console.log(n);
  }
  son();
}
fun(); //11
fun(); //11

如果我们可以在全局中直接调用son函数,那么便可以达成想要的效果。son函数现在是作为局部变量存在,要想在全局中访问,一般有两种方法:

一种是赋值给全局变量

var a;
function fun(){
  var n=10;
  a = function son(){
    n++;
    console.log(n);
  }
}
fun(); //son()
a(); //11
a(); //12

另一种是使用return返回值

function fun(){
  var n=10;
  return function son(){
    n++;
    console.log(n);
  }
}
var a=fun();
a(); //11
a(); //12

上面的son()函数就是闭包,某种意义上所有函数都可以看作闭包。闭包就是可以访问外层函数作用域的变量的函数。

var a;
function fun(){
  var n=10;
  a = function son(){
    n++;
    console.log(n);
  }
  return a();
}
fun(); //11
a(); //12
a(); //13
fun(); //11
a(); //12
a(); //13

还是上面那段代码,我们稍微修改下,再看看执行结果,这是因为每次执行fun()函数时都会初始化变量n。

闭包的好处是减少全局变量,避免全局污染,可以将局部变量保存在内存中。但这既是优点又是缺点,一段代码中如果闭包过多,有可能造成内存泄露。由于闭包中局部变量不会被垃圾回收机制回收,所以需要手动赋值为null(关于内存泄露,后期单独开专题)



相关阅读:
简介JavaScript中Math.LOG10E属性的使用
Win7系统怎么关闭硬件加速?Win7关闭硬件加速的方法
Java函数式编程(二):集合的使用
Redhat 6.2 下 oracle 11g R2的安装详解
Jquery实现点击按钮,连续地向textarea中添加值的实例代码
PHP中error_reporting()用法详解
Android中Glide加载库的图片缓存配置究极指南
如何调试报表插件
Js可拖拽放大的层拖动特效实现方法
基于JavaScript实现div层跟随滚动条滑动
ASP.NET MVC5网站开发之用户资料的修改和删除3(七)
php构造函数与析构函数
CSS复合选择器使用介绍
php抓取网站图片并保存的实现方法
快速导航
PHP MySQL HTML CSS JavaScript MSSQL AJAX .NET JSP Linux Mac ASP 服务器 SQL jQuery C# C++ java Android IOS oracle MongoDB SQLite wamp 交通频道 作文范文 兵团教育信息化工作会议主持词 高考升学宴演讲词 父爱窝在被窝里作文500字 【牵手与你,舞醉春天】 永世伤痕作文500字 前事不忘后事之师700字 怀念邻里之情作文900字 逝去了作文200字 有关六一儿童节500字作文 积极推进校园警务建设全力构建平安和谐校园 在政协九届三次委员会闭幕会上的讲话 路漫漫550字 高考算什么 【现代诗】一盏灯 如何安排高考生的饮食 繁华为尘,俗世陌路 我也来跳健身操 技术创新演讲稿 那一句伤透我心的话【我越来越不相信你了】 第一次月考300字 "不送礼",破"四风","转作风"的心得体会 疲惫过后,请微笑 悲伤的、伤感的、心情不好的经典语录 【精品】青春与理想的演讲稿 学会创新读苹果里的星星有感作文500字 零碎的思想作文450字 小兔子伟大的一天 颁奖典礼发言稿 药监器械科科学发展观演讲稿 森林报好词好句好段大全 遇见色狼最好的防身技能 励志故事:客观看自己,努力靠自己 书我的老师 那时的朋友作文100字 其实你并不了解我(二) 闾丘露薇:我希望对得起这份职业 2013年给毕业生的祝福语 关于军训的周记600字 旧爱是心底搁浅的舟 2016煤矿安全决心书保证书 我的多功能文具盒500字 雨丝作文300字 花儿常开,人难留…… 新的观念如何代替老旧的思想 七一致老党员的一封慰问信 被困的小熊 幸福句子大全 高中入团申请书400字范文 如果有选择,我愿意抽掉我的记忆 中华民俗百诗(041--050)

Copyright © 2016 phpStudy |