VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > temp > JavaScript教程 >
  • js闭包

js闭包的官方解释:一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分。个人理解就是:就是一个在函数内部的函数,他可以访问他的外部函数的变量的AO里面的所有值。当然GO里面的值也可以访问。(在了解闭包前,你必须先了解js的作用域,作用域链)。反过来说,当函数内部包含一个内部函数,并且被返回保存该内部函数,就会产生会产生闭包;这样还是有点抽象,看一个例子;

复制代码
 1 <script type="text/javascript">
 2         //总结:当内部函数被返回到外部并且保存时,一定会产生闭包,闭包会产生 原来的作用域链不释放,过度的闭包会导致内存泄漏,或者加载过慢。
 3         function breadMgr(num){
 4             var breadNum = arguments[0] || 0;
 5             function supply(){
 6                 breadNum += 10;
 7                 console.log(breadNum);
 8                  }
 9 
10             function sale(){
11                 breadNum --;
12                 console.log(breadNum);
13             }
14             return [supply,sale];
15         }
16 
17         var breadMgr = breadMgr(50);
18         breadMgr[0]();
19         breadMgr[1]();
20 
21         //第二个例子,解释一下结果是什么,为什么//需要联系AO 和GO
22         function test1(){
23             var arr = [];
24             for(var i = 0;i < 10;i++){
25                 arr[i] = function(){
26                     console.log(i+",");
27                 }
28 
29             }
30             return arr;
31         }
32         var myArr = test1();
33         for(var j = 0;j<10;j++){
34             myArr[j]();
35         }
36     </script>
复制代码

解析:

breadMgr[0]();的结果是60

breadMgr[0]();的结果是59

下面的for循环下面的结果是 10 个10;

这里,我们先只看第一例子:


复制代码
 1 function breadMgr(num){
 2             var breadNum = arguments[0] || 0;
 3             function supply(){
 4                 breadNum += 10;
 5                 console.log(breadNum);
 6                  }
 7 
 8             function sale(){
 9                 breadNum --;
10                 console.log(breadNum);
11             }
12             return [supply,sale];
13         }
14 
15         var breadMgr = breadMgr(50);
16         breadMgr[0]();
17         breadMgr[1]();
复制代码
作用域 GO: breadMgr = function breadMgr(){...}
执行:
  AO:breadNum = undefined
    breadNum = 50
执行:
    supply = function supply(){...}
    sale = function sale(){...}
    返回 [supply,sale];
breadMgr[0]()的执行结果就是 60;
breadMgr[1]()的执行结果就是59;

第二个例子:
复制代码
 1 function test1(){
 2             var arr = [];
 3             for(var i = 0;i < 10;i++){
 4                 arr[i] = function(){
 5                     console.log(i+",");
 6                 }
 7 
 8             }
 9             return arr;
10         }
11         var myArr = test1();
12         for(var j = 0;j<10;j++){
13             myArr[j]();
14         }
复制代码

预解析 GO: test1= function test1(){....}

     myArr = undefined

执行:test1预解析:arr = undefined

       执行:  arr = []

            arr[i] = function(){console.log(i+',")}

        总共执行10次,最后i 的结果是10;

这里解释一下,for(var i = 0; i<10;i++) 等同于 var i = 0;if(i<10){i++;.......};所以这里的i就是 10;

i = 10 ,数组下标是 0-9 ,每个值都是function(){console.log(10+',")},

执行 for(var j=0;j<10;j++)后,打印每个结果就是 10 ;

 

最后还介绍一下,闭包的写法:

复制代码
 1 <script type="text/javascript">
 2         //return 写法
 3         function test() {
 4             var a = 1;
 5             function add() {
 6                 a++;
 7                 console.log(a);
 8             }
 9             return add;//这里 可以写成 window.add = add;
10         }
11         var add = test();
12         add();
13 
14         // window写法
15         function test2() {
16             var b = 1;
17             function add1() {
18                 b++;
19                 console.log(b);
20             }
21             window.add1 = add1;
22         }
23         test2();
24         add1();
25     </script>
复制代码

 

我从来不相信什么懒洋洋的自由。我向往的自由是通过勤奋和努力实现的更广阔的人生。 我要做一个自由又自律的人,靠势必实现的决心认真地活着。

来源:https://www.cnblogs.com/lixiuming521125/p/10953978.html

相关教程