唯品秀前端博客
当前位置: 前端开发 > JavaScript > 浅谈JavaScript中的闭包

浅谈JavaScript中的闭包

2017-07-22 分类:JavaScript 作者:管理员 阅读(11829)

闭包是指有权访问另一个函数作用域中的变量的函数,个人认为闭包最大的用处就是防止对全局作用域的污染。 试想如果我们把一些仅仅只用到一两次的变量都声明在全局作用域中,最后肯定是容易出错且不可维护的。而闭包最神奇的地方就是能在一个函数外访问函数中的局部变量,把这些变量用闭包的形式放在函数中便能避免污染。

一、闭包是什么?

《JavaScript高级程序设计》中写道:“闭包是指有权访问另一个函数作用域中的变量的函数”,如果用下定义的观点看,这句话就是说“闭包是函数”,我带着怀疑的心态又去网上找了找,发现什么说法都有,终究没能明白闭包的含义,还是看代码来得直接。

1
2
3
4
5
6
7
8
9
function outter(){
  var sky="blue";
  function inner(){
    console.log(sky);
  }
  return inner;
}
var result=outter();
result();    //"blue"

这段代码就包含一个简单的闭包:outter函数的返回值是一个函数,即inner。inner在outter内部,理所当然能访问到局部变量sky,但当inner作为outter的返回值赋给outter外的全局变量时,神奇的事情发生了:在全局作用域中访问到了sky,这就是闭包。

二、闭包的原理?

每个函数都有自己的执行环境,当一个函数被执行时,它的执行环境就会被推入环境栈,其活动对象(存储环境中定义的变量及函数)加入作用域链中,一旦函数执行完,栈将其环境弹出,活动对象被销毁。

对于上面的例子来说,outter执行完之后将返回inner给了result,outter的执行环境从环境栈弹出,控制权交给全局环境,outter的活动对象理应被销毁。但此时inner已经存储在全局活动对象中了,同时inner需要访问sky,所以outter的活动对象没有被销毁,即使result执行完毕,outter的活动对象依然存在于作用域链中,只有当result被销毁

1
result = null

outter的活动对象才会彻底释放。

三、闭包有什么用?

说了这么多,闭包到底有什么用呢?我个人认为闭包最大的用处就是防止对全局作用域的污染。 试想如果我们把一些仅仅只用到一两次的变量都声明在全局作用域中,最后肯定是容易出错且不可维护的。而闭包最神奇的地方就是能在一个函数外访问函数中的局部变量,把这些变量用闭包的形式放在函数中便能避免污染。

四、Caveat

  • 闭包将函数的活动对象维持在内存中,过度使用闭包会导致内存占用过多;
  • 闭包只能取得外部函数中任何变量的最后一个值,在使用循环且返回的函数中带有循环变量时会得到错误结果;
  • 当返回的函数为匿名函数时,注意匿名函数中的this指的是window对象。

「三年博客,如果觉得我的文章对您有用,请帮助本站成长」

赞(7) 打赏

谢谢你请我吃鸡腿*^_^*

支付宝
微信
7

谢谢你请我吃鸡腿*^_^*

支付宝
微信

上一篇:

下一篇:

你可能感兴趣

12 条评论关于"浅谈JavaScript中的闭包"

  1. 超级管理员 未知操作系统 未知浏览器

    已经有的,那个跳动的音符点击下就是关闭导航音效

  2. 增达网 Windows 7 搜狗浏览器 2.X

    看了大有收获,真的没有白来!

  3. 杭州家政网 Windows 7 搜狗浏览器 2.X

    值得思考哦,受教了!

  4. 潇湘之君 未知操作系统 未知浏览器

    [给力] 博客超赞,已收藏!建议加个关闭音效按钮,不玩那个的会觉得别扭 [呵呵]

  5. 西江风月 未知操作系统 未知浏览器

    [嘻嘻] 文字有小清新吗

  6. 依赖沉默 未知操作系统 未知浏览器

    666牛逼

  7. 超景王 未知操作系统 未知浏览器

    置顶的文章都有介绍开发方案呢

  8. 韦不冒 未知操作系统 未知浏览器

    怎么跟您友情链接呢 博客很不错 http://www.dingyue.pro

  9. 微笑背后的伤 未知操作系统 未知浏览器

    怎么跟您友情链接呢 博客很不错 http://www.dingyue.pro

  10. 想念沒有說要醉 未知操作系统 未知浏览器

    你好,向问一下这个网页是怎么做的,您微信多少,希望求教

  11. 玉人素手刺鸳鸯 未知操作系统 未知浏览器

    真想做你学生

  12. 蓳小篸_ 未知操作系统 未知浏览器

    大牛+大赞,文字小清新,我猜楼主一定是一枚美男子 [呵呵]

博客简介

唯品秀博客: weipxiu.com,一个关注Web前端开发技术、关注用户体验、坚持更多原创实战教程的个人网站,愿景:成为宇宙中最具有代表性的前端博客,期待您的参与,主题源码 

精彩评论

  • 江吟辞(1周前 (06-29))

    好难坚持啊,我还没毕业,不知道啥时候才能像您一样厉害

    评:碎言碎语
  • 和我、恋爱吧(1周前 (06-29))

    怎么没见你更新呢,比较忙吗

    评:碎言碎语
  • 游离(1周前 (06-29))

    站主,你好!请教一下,前台的pc 端和移动端,你是怎么实现响应式的呢?媒体查询的同时写两套样...

    评:碎言碎语
  • 권지용(1周前 (06-29))

    最近在学习前端,看了博主很多文章,收益匪浅,感谢大佬

    评:碎言碎语
  • 白君也(1周前 (06-28))

    哇 自己制作的吗 在哪学的技术啊 好厉害

    评:碎言碎语
  • 管理员(3周前 (06-16))

    时间区间问题,因为目前是2020年,你所选不可能超出这个时间吧,当然,代码是根据你的业务来,...

    评:js时间戳完美转换成阴历农历格式

友情链接

他们同样是一群网虫,却不是每天泡在网上游走在淘宝和网游之间、刷着本来就快要透支的信用卡。他们或许没有踏出国门一步,但同学却不局限在一国一校,而是遍及全球!申请交换友链

站点统计

  • 文章总数: 258 篇
  • 草稿数目: 0 篇
  • 分类数目: 16 个
  • 独立页面: 6 个
  • 评论总数: 902 条
  • 链接总数: 17 个
  • 标签总数: 459 个
  • 注册用户: 8220 人
  • 访问总量: 9212260 次
  • 最近更新: 2020年7月3日
服务热线:
 173xxxx7240

 QQ在线交流

 旺旺在线