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 交通频道 作文范文 老婆我错了检讨书 当幸福来敲门作文1100字 承诺只是笑话吗 诚信作文600字 考拉小巫的英语学习日记读后感 余光中 《乡愁》 让母亲多幸福一点 你只是在用勤奋掩饰你的懒惰 游灯会 2016金融应届生个人简历 贯彻十七大交通系统演讲稿 风入松(闻邻女吹笛) 蜘蛛和乌鸦 这件事教育了我作文 贺铸:感皇恩 创建社团策划书 游览上海科技馆 QQ心情美文美句经典语录 读《我的朋友是铁三角》有感作文650字 人心与仁心议论文 花布与铁门】 我爱你,小草作文600字 西楼,戏人生 2016年工作计划范文 接力球游戏 软银阎焱创业演讲:创业风可以让猪飞起来,也能吹掉裤衩 早安心语 幸福人生的三种姿态 路过·风筝作文100字 小学五年级作文600字:老妈减肥记 学校感恩节主题活动总结 图书出版合同(自费) 我爱中华读后感 黄瓜国王读后感350字 《沁园春》 梦圆时分作文200字 续写穷人作文600字 翻 开 童 年作文700字 未来城市的公民 顶岗实习支教总结范文 鹊桥仙·荷塘留妍 这天才是要记住的500字 小学六年级作文300字:母鸡又下红壳蛋了 励志故事:你自己最伟大_励志故事 最后的一杯咖啡 学校老干工作总结 家长座谈会主持词 给女朋友道歉的话,向女朋友认错的句子,给女朋友道歉的短信 2016煤矿党代会报告 2016应用文写作学习总结 帮外婆洗脚

Copyright © 2016 phpStudy |