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

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

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

还是自己总结下:

什么样才能产生闭包?在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引擎会尝试回收被闭包占用的内存,但请大家还是要慎重使用闭包。”

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

JavaScript 闭包(随笔)的更多相关文章

  1. javascript闭包详解

    以前写过一篇关于javascript闭包的随笔,javascript闭包,但是写的不够详细,也没有体现出闭包的强大之处.故作此篇. 众所周知,javascript没有块级作用域,只有函数作用域.那就意 ...

  2. 《Web 前端面试指南》1、JavaScript 闭包深入浅出

    闭包是什么? 闭包是内部函数可以访问外部函数的变量.它可以访问三个作用域:首先可以访问自己的作用域(也就是定义在大括号内的变量),它也能访问外部函数的变量,和它能访问全局变量. 内部函数不仅可以访问外 ...

  3. JavaScript 闭包深入浅出

    闭包是什么? 闭包是内部函数可以访问外部函数的变量.它可以访问三个作用域:首先可以访问自己的作用域(也就是定义在大括号内的变量),它也能访问外部函数的变量,和它能访问全局变量. 内部函数不仅可以访问外 ...

  4. JavaScript闭包(Closure)

    JavaScript闭包(Closure) 本文收集了多本书里对JavaScript闭包(Closure)的解释,或许会对理解闭包有一定帮助. <你不知道的JavsScript> Java ...

  5. Javascript闭包和C#匿名函数对比分析

    C#中引入匿名函数,多少都是受到Javascript的闭包语法和面向函数编程语言的影响.人们发现,在表达式中直接编写函数代码是一种普遍存在的需求,这种语法将比那种必须在某个特定地方定义函数的方式灵活和 ...

  6. javascript闭包理解

    //闭包理解一 function superFun(){ var _super_a='a'; function subfuc(){ console.log(_super_a); } return su ...

  7. Javascript闭包深入解析及实现方法

    1.什么是闭包 闭包,官方对闭包的解释是:一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分.闭包的特点:1. 作为一个函数变量的一个引用,当函数返回时 ...

  8. javascript闭包和作用域链

    最近在学习前端知识,看到javascript闭包这里总是云里雾里.于是翻阅了好多资料记录下来本人对闭包的理解. 首先,什么是闭包?看了各位大牛的定义和描述各式各样,我个人认为最容易一种说法: 外部函数 ...

  9. JavaScript闭包深入解析

    for (var i=1; i<=5; i++) { setTimeout( function timer() { console.log( i ); }, i*1000 ); } --上面这段 ...

随机推荐

  1. try catch finally 和return

    结论:1.不管有木有出现异常,finally块中代码都会执行:2.当try和catch中有return时,finally仍然会执行:3.finally是在return后面的表达式运算后执行的(此时并没 ...

  2. javascript实现正整数分数约分

    //m,n为正整数的分子和分母 function reductionTo(m, n) { var arr = []; if (!isInteger(m) || !isInteger(n)) { con ...

  3. 【C++对象模型】第六章 执行期语意学

    执行期语意学,即在程序执行时,编译器产生额外的指令调用,确保对象的构造,内存的释放,以及类型转换与临时对象的生成的安全进行. 1.对象的构造和析构 对于类对象的构造,一般在定义之后则开始内部的构造过程 ...

  4. Elasticsearch 5.6.5 安装教程

    下载地址   https://www.elastic.co/downloads/past-releases/elasticsearch-5-6-5 安装环境  centos6.5  ,  jdk1.8 ...

  5. 策略模式 C#

    策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模式让算法独立于使用它的客户而独立变化. 抽象策略角色: 策略类,通常由一个接口或者抽象类实现. 具体策略角色:包装了 ...

  6. UIImagePickerController---iOS-Apple苹果官方文档翻译

    //本系列所有开发文档翻译链接地址:iOS7开发-Apple苹果iPhone开发Xcode官方文档翻译PDF下载地址  //转载请注明出处--本文永久链接:http://www.cnblogs.com ...

  7. 【洛谷 P1419】 寻找段落(二分答案,单调队列)

    题目链接 开始还以为是尺取.发现行不通. 一看标签二分答案,恍然大悟. 二分一个\(mid\)(实数),把数列里每个数减去\(mid\),然后求前缀和,在用单调队列维护\(sum[i-t\text{~ ...

  8. 大聊Python----协程

    协程 协程,又称微线程,纤程.英文名Coroutine.一句话说明什么是线程:协程是一种用户态的轻量级线程. 协程拥有自己的寄存器上下文和栈.协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来 ...

  9. Linux线程基础函数

    1. 线程标识: (1) 比较两个线程ID: #include <pthread.h> int pthread_equal(pthread_t tid1, pthread_t tid2); ...

  10. WAMP Apache 2.5 配置虚拟主机

    1.在 Apache 的安装目录下 conf/httpd.conf 文件中搜索 hosts,去掉 Include 前面的 “#” 号后,即可启用虚拟主机. # Virtual hosts #Inclu ...