JavaScript--浅谈闭包

闭包通常用来创建内部变量,使得这些变量不能被外部随意修改,同时又可以通过指定的函数接口来操作。

类似于面向对象中 的构造器,通过闭包实现 private 和 public 变量的声明。

(1)、使用闭包主要是为了设计私有的方法和变量。闭包的优点是可以避免全局变量的污染,缺点是闭包会常驻内存,会增大内存使用量,使用不当很容易造成内存泄露。
(2)、闭包有三个特性:
a、函数嵌套函数
b、函数内部可以引用外部的参数和变量
c、参数和变量不会被垃圾回收机制回收

作用域就不说了,先来理解一个概念:作用域链

 

当定义一个函数时,它实际上保存一个作用域链。

当调用这个函数时,它创建一个新的对象来存储他的局部变量,并将这个对象添加至保存的那个作用域链上,同时创建一个新的更长的表示函数调用作用域的‘链’。

下面来举个栗子:

 var scope = 'G scope';
function checkscope(){
          var scope = 'L Scope';
          function f(){
                      return scope;
                         }
          return f();
 }
checkscope();  //   ‘L Scope’



var scope = 'G scope';
function checkscope(){
          var scope = 'L Scope';
          function f(){
                      return scope;
                         }
          return f;
 }
checkscope()(); //  'L Scope'
简单来说, 定义  f  时候生成 的 作用域链保存了当前作用域的所有对象,包括 var scope = ‘L Scope’;  这个局部变量。
 
函数定义时的作用域链到函数执行时依然有效。这句话就是闭包的精髓了。
引用阮一峰的话,闭包可以用在许多地方。它的最大用处有两个,一个是可以读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中。
 
如何读取函数内部的变量呢?看下面你就知道了:

function f1(){

    var n=999;

    function f2(){
      alert(n); 
    }

    return f2;

  }

  var result=f1();

  result(); // 999

 

如何让这些变量的值始终保持在内存中呢?

 

function f1(){     

  var n=999;     

  nAdd=function(){n+=1}     

  function f2(){       

    alert(n);     

  }     

  return f2;   

}   

  var result=f1();   

  result(); // 999   

  nAdd();   

  result(); // 1000

      result = null;//销毁匿名函数,闭包所包含的活动对象也就一起释放了

      var result=f1();   

  result(); // 999   

函数作为返回值时,连同函数定义时的环境(包括函数外部,函数可以访问到的变量)一起返回,确保这些变量不因其依附的对象销毁而被销毁。

这就是闭包的作用。

 

转载于:https://www.cnblogs.com/zwhblog/p/7279099.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值