首页 > 代码库 > js闭包

js闭包

2017-03-23

文章来源:http://www.cnblogs.com/daysme

变量分为全局变量和局部变量。他们之前是用函数隔开的。除了函数,其他都没有作用域之说。全局变量:可重用。易被污染。局部变量:不会被污染,不能重用。闭包:既能重用变量,又能保护变量不被污染。  在函数内声明一个函数,并把这个函数返回出来。  闭包就是能读取其他函数内局部变量的函数。因为只有函数内部的子函数才能读取局部变量,  因为可以把闭包理解为定义在一个函数内部的函数。闭包的作用:  一个是可以读取函数内部的局部变量。  一个是让这些变量始终保存在内存中。全局变量var n=1;function fn(){  console.log(n);}fn();局部变量function fn(){  var n=1;}fn();console.log(n); //获取不到变量,并报错返回变量-最初的闭包思想function fn(){  var n=1;  return 1;}var a=fn();console.log(a);闭包,其实就是一种函数。function fn(){  var n=1;  return function(){    console.log(n)  };}var a=fn();a();例子:function fn(){  var n=1;  add=function(){    n++;  }  function fn1(){    console.log(n); //获取变量  }  return fn1; //返回出来}var result=fn(); //保存到全局变量中result();add();result();此时 fn 中的局部就是一直保存在内存中,并没有在fn被调用后销毁。为什么没有被销毁?因为 fn1() 被返回出来并且由全局变量接收保存了,全局变量result是不会被销毁的,但result的值是fn1,fn1的值引用着 fn() 中的 n ,所以 fn 也不会被删除。闭包三个步:  1.外层函数包裹着受保护的变量和操作变量的内层函数。  2.外层函数把内层函数返回到函数外。  3.使用者调用外层函数,获得内层函数。  此时被返回出来的函数就叫闭包。闭包形成的原因:  外层函数的作为域对象无法释放。例,没用到上层函数的任何东西。var name=‘the window‘;var objcet={  name:‘my objcet‘,  getname:function(){    return function(){      return this.name;    }  }}console.log(objcet.getname()());例, 指向obj的this 已经保存在内存中。var name=‘the window‘;var objcet={  name:‘my objcet‘,  getname:function(){    var that=this;    return function(){      return that.name;    }  }}console.log(objcet.getname()());

 

js闭包