码迷,mamicode.com
首页 > Web开发 > 详细

js闭包

时间:2015-05-29 11:41:40      阅读:124      评论:0      收藏:0      [点我收藏+]

标签:

  1.闭包:

  闭包是可以包含自由(未绑定到特定对象)变量的代码块;这些变量不是在这个代码块内或者任何全局上下文中定义的,而是在定义代码块的环境中定义(局部变量)。“闭包” 一词来源于以下两者的结合:要执行的代码块(由于自由变量被包含在代码块中,这些自由变量以及它们引用的对象没有被释放)和为自由变量提供绑定的计算环境(作用域)。在 Scala、Scheme、Common Lisp、Smalltalk、Groovy、JavaScript、Ruby、 Python、Go、Lua、objective c 以及Java(Java8及以上)等语言中都能找到对闭包不同程度的支持。
 
  2.js闭包  
  在Javascript中闭包(Closure)“官方”的解释是:所谓“闭包”,指的是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分。参看下面这段代码
function a(){
  var i=0;
  function b(){
    alert(++i);
  }
  return b;
}
var c=a();
c();
 
特点
这段代码有两个特点:
1、函数b嵌套在函数a内部;
2、函数a返回函数b。
这样在执行完var c=a( )后,变量c实际上是指向了函数b,再执行c( )后就会弹出一个窗口显示i的值(第一次为1)。这段代码其实就创建了一个闭包,为什么?因为函数a外的变量c引用了函数a内的函数b,就是说:当函数a的内部函数b被函数a外的一个变量引用的时候,就创建了一个闭包。

作用

简而言之,闭包的作用就是在a执行完并返回后,闭包使得Javascript的垃圾回收机制GC不会收回a所占用的资源,因为a的内部函数b的执行需要依赖a中的变量。在上面的例子中,由于闭包的存在使得函数a返回后,a中的i始终存在,这样每次执行c(),i都是自加1后alert出i的值。
那 么我们来想象另一种情况,如果a返回的不是函数b,情况就完全不同了。因为a执行完后,b没有被返回给a的外界,只是被a所引用,而此时a也只会被b引 用,因此函数a和b互相引用但又不被外界打扰(被外界引用),函数a和b就会被GC回收。
另一个例子
模拟私有变量
function Counter(start){
var count = start;
  return{
  increment:function(){
  count++;
  },
  get:function(){
  return count;
  }
  }
  }
  var foo =Counter(4);
  foo.increment();
  foo.get();// 5

结果

这里,Counter 函数返回两个闭包,函数 increment 和函数 get。 这两个函数都维持着对外部作用域 Counter 的引用,因此总可以访问此作用域内定义的变量 count.
 
  3.闭包的优缺点:
  
  优点:可以实现封装,外界无法直接访问其内部变量,直接修改变量
     避免全局变量的污染
     设计私有的变量和方法
  缺点:一直占用内存,IE下容易造成内存泄露
  
  补充:
  立即执行的匿名函数也是闭包的一种,如下:
  

var $Darren; 

(function(){ 

var Obj={version:"1.0",author:"Darren"}; 

Obj.Add=function(arg1,arg2){ 

return (arg1+arg2); 

Obj.Multi=function(arg1,arg2){ 

return (arg1*arg2); 

$Darren=Obj; 

})(); //匿名函数,并使其马上执行 

alert($Darren.Add(6,2)); //结果 8 

alert($Darren.Multi(3,5)); //结果15 

  

js闭包

标签:

原文地址:http://www.cnblogs.com/iliuyuet/p/4537910.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!