唯品秀前端博客

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

一、闭包是什么?

《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对象。
本站所有文章、图片、资源等如无特殊说明或标注,均为来自互联网或者站长原创,版权归原作者所有;仅作为个人学习、研究以及欣赏!如若本站内容侵犯了原著者的合法权益,可联系我们进行处理,邮箱:343049466@qq.com
赞(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. 蓳小篸_
    未知操作系统 未知浏览器

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

  13. 暂无留言哦~~
谢谢你请我吃鸡腿*^_^*

支付宝扫一扫打赏

微信扫一扫打赏