闭包,伟大的闭包.... 先看看百科对百度的定义是什么样的。

百科说:闭包是指可以包含自由(未绑定到特定对象)变量的代码块;这些变量不是在这个代码块内或者任何全局上下文中定义的,而是在定义代码块的环境中定义(局部变量)。

看完整个人都不好了。  这都是什么鬼???

还是自己总结下:

什么样才能产生闭包?在javascript技术层面上来说父函数嵌套子函数的形式就可能会产生闭包函数。如这样的:

//闭包函数fn的创建
function fn (){
  var a = 2;
  var b = 4;
  function fn1(){
console.log(a);
  };
  fn1();
     }
fn();

  

  解析:fn1.[[scope]] --> fn.lexical environme || fn.[[scope]]      //

闭包的个人理解:

在创建fn1子函数的时候会给fn1加一个scope属性,而这个属性指向的是fn父函数的词法环境。如果fn函数还有父函数的话,fn的scope属性又指向该函数的父级函数的词法环境,如此就形成了一个作用域链。

所以闭包的本质是因为JS支持这种作用域链而且还支持函数嵌套函数才会导致有闭包的可能。嗯。。 就是这个原因!!!

1、在子函数内部不调用父函数的任何自由变量此时不会有闭包产生;
2、在子函数的子涵内部用父函数的父函数的任何自由变量此时会产生闭包;

如:

//第一种情况:不会产生闭包			
  function fn (){
    var j = 4;
    function fn1(){
      console.log("子函数代码内部没调用符函数的任何东西,不会产生闭包;")
    };
    fn1();
  };
  fn();
//第二种情况:产生闭包
  function fm(){
    var k = 5;
    function fm1(){
      var y = 9;
      function fm2(){
        console.log(k) //此函数调用了父级的父级函数内部的变量则会有闭包产生; closure -> k:5
      };
      fm2();
    };
    fm1();
  };
  fm();

  闭包的简单例子:

// 计算base 和 max 的和,但是max要从1一直加到max的值然后与base相加;(利用闭包的来做的话可以减少定义全局变量的数量)
function calfu (base){
  return function (max){
    var total = 0;
    for (var i =1; i <= max; i++) {
    total = total + i;
  }
    return total + base;
  };
};
var reult = calfu(2);
reult(3) // 1+2+3+2 == 8
alert(reult(3)); //弹出结果为8

  最后来一句:

“由于闭包携带包含它的函数的作用域,因此会比其他函数占用更多的内存。过度使用闭包可能会导致内存占用过多,我们建议读者只在绝对必要时再考虑使用闭包。虽然像

V8等优化后的Javascript引擎会尝试回收被闭包占用的内存,但请大家还是要慎重使用闭包。”

嗯。  对。这是大神说的话。。慎重,慎重,再慎重....

最新文章

  1. 今天写项目时,突然发现canvas的一些公式不记得了,所以整理了一番,分享给大家。
  2. USACO 刷水
  3. NOIP200205均分纸牌
  4. PHP 关于 $GLOBALS[&#39;HTTP_RAW_POST_DATA&#39;]
  5. 【LeetCode练习题】Maximum Depth of Binary Tree
  6. 微信token认证方法原理
  7. Week14(12月11日):路由
  8. mysql+ssh整合样例,附源代码下载
  9. [ios2]BaaS服务收藏 【转】
  10. JS中Exception处理
  11. solr 分词词库管理思路
  12. Https系列之二:https的SSL证书在服务器端的部署,基于tomcat,spring boot
  13. P2178 [NOI2015]品酒大会
  14. My SQL随记 003 数据表基础操作语法
  15. ARM v8中断机制和中断处理(转)
  16. LY.JAVA.DAY12.String类
  17. supervisor安装、使用详解
  18. word2vec_训练模型
  19. Python学习笔记五:错误与异常
  20. Parquet

热门文章

  1. book_notes
  2. [Android问答] px、dp和sp,这些单位有什么区别?
  3. JavaScript知识递归实现数组中指定后代元素的查找
  4. AngularJs 中的CheckBox前后台交互
  5. C11简洁之道:lambda表达式
  6. 获取数据源数据的实现---Architecting Android
  7. 【BZOJ】2151 种树
  8. Android中自定义属性attr.xml的格式详解
  9. python中multiprocessing模块
  10. Python3 嵌套函数