闭包all

1.0 定义:有权访问另一个函数作用域内变量的函数都是闭包。

2.0 Js语言特殊之处在于函数内部可以直接读取全局变量

<script type="text/javascript">
var n=100;
function parent(){
  alert(n);
}
parent();//100
< /script>

3.0在函数外部无法读取函数内的局部变量

<script type="text/javascript">
function parent(){
  var m=50;
}
parent();
alert(m);//报错 m未定义
</script>

3.1 注意函数内部声明变量时一定要加var,否则就声明了一个全局变量

function parent(){
m=50;
}
parent();
alert(m);//50

4.0 闭包的作用有2个:
一是前面提到的读取函数内部的变量,
二是让这些变量的值保存在内存中,实现数据共享

5.0

<script type="text/javascript">
function parent(){
   var m=50;
   function son(){
        alert(m);
   }
   return son;
}
var s=parent();//将结果保存在全局里
s();//50
< /script>

son函数就是闭包。

6.0 例子

<script type="text/javascript">
var cnt=(function(){
    var i=0;
    return function(){
        alert(i);
        i++;
    }
})();
cnt();//0
cnt();//1
cnt();//2
cnt();//3

</script>

把匿名函数的执行结果(即对里面子函数的声明赋给全局变量cut),i就保存在内存里了
执行cut()时就直接从内存取值了,i只有cnt()函数才能调用,直接alert(i)是不行的

7.0var cnt=(function(num){
return function(){
    alert(num);
    num++;
  }
})(5);
cnt();//5
cnt();//6
cnt();//7
//当然还可以调用时传参
var cnt=(function(){
    var i=0;
return function(num){
    num+=i;
    alert(num);
    i++;
  }
})();
cnt(1);//1
cnt(2);//3
cnt(3);//5

8.0

<script type="text/javascript">
function box(){
var arr=[];
for(i=0;i<5;i++){
arr=function(){return i;}
}
return arr;
}
var a=box();

alert(a);
alert(typeof a);//function
alert(a());
</script>

弹出的函数体
function(){return i;}    }
最后这个i是4,之后++成为5

原文地址:https://www.cnblogs.com/lieaiwen/p/8385557.html