JS闭包

function f1(){
    n=999;
    
   function f2(){
    
      alert(n);
    }  
   return f2; 
}

//为啥直接f1()访问不到
var result = f1();
result();

f2函数就是闭包。简单来理解,闭包就是能够读取其他函数内部变量的函数。
在js中,只有函数内部的子函数才能读取局部变量,因此闭包可以理解为,定义在一个函数内部的函数
闭包的用途
1,可以读取函数内部的变量
2,就是让这些变量的值始终保持在内存中。
function outerFun()
{
 var a=0;
 function innerFun()
 {
  a++;
  alert(a);
 }
 return innerFun;  //注意这里
}
var obj=outerFun();
obj();  //结果为1
obj();  //结果为2
var obj2=outerFun();
obj2();  //结果为1
obj2();  //结果为2
//var obj=outerFun()后,变量obj实际上是指向了函数innerFun,再执行c()后就会弹出一个窗口显示i的值;
//当函数a的内部函数b被函数a外的一个变量引用的时候,就创建了一个闭包。
当内部函数 在定义它的作用域 的外部 被引用时,就创建了该内部函数的闭包 ,如果内部函数引用了位于外部函数的变量,当外部函数调用完毕后,这些变量在内存不会被 释放,因为闭包需要它们.
 
闭包的作用:
闭包的作用就是在outerFun执行完并返回后,闭包使得Javascript的垃圾回收机制GC不会收回outerFun所占用的资源,因为outerFun的内部函数innerFun的执行需要依赖outerFun中的变量。
 
也就说遇到需要存储动态变化的数据或将被回收的数据时,我们可以通过外面再包裹一层函数形成闭包来解决。
function a(){
  var n = 0;
  function inc() {
    n++;
    console.log(n);
  }
  inc();
  inc();
}
a(); //控制台输出1,再输出2
 
function a(){
  var n = 0;
  this.inc = function () {
    n++;
    console.log(n);
  };
}
var c = new a();
c.inc();  //控制台输出1
c.inc();  //控制台输出2
 
------------------------------------------------------------------------------
function foo(x) {
var tmp = 3;
function bar(y) {
alert(x + y + (++tmp));
}
bar(10);
}
foo(2) ;
foo(2) ; 不管执行多少次都会alert--16 ,因为bar能访问foo的参数x,也能访问foo的变量tmp。
  但,这还不是闭包。因为bar()一直在自己的作用域被引用。当你return的是内部function时,就是一个闭包。
------------------------------------------------------------------------------------------------
function a(){
var n = 4;
function b(y){
alert(y+(++n));
}
return b;
}
c=a();
c(10); ----15
c(10); ----16 这个是闭包
--------------------------------------------------------------------------------------------------------
 
 
posted @ 2017-10-23 09:14  千寻的天空之城  阅读(142)  评论(0编辑  收藏  举报