JavaScript--闭包

一.闭包的特点,以及闭包与垃圾回收机制的关系

 1 <script>
 2         /**
 3          *  闭包结构的特点
 4          *      函数嵌套的函数
 5          *      被嵌套的函数有返回值,这个返回值调用了外函数的变量
 6          **/
 7 
 8 
 9         /**
10          *  垃圾回收机制
11          *      变量创建的时候会占用内存
12          *      垃圾回收机制会被没用到的变量和用完的变量回收(从内存里面删除)
13          * */
14 
15         function fn1() {
16             // 局部变量
17             var data1 = "数据";
18             function fn2() {
19                 return data1;
20             }
21             return fn2;
22         }
23 
24 
25 //        console.log(fn1()); // 输出fn2
26 
27         // 这里能输出局部变量里保存的数据,说明垃圾回收机制没有把局部变量回收
28         // 坏处:占用内存(局部变量没有被删除)
29         // 好处:局部变量data1不会污染外部变量
30         console.log(fn1()()); // "数据"
31     </script>

二.非闭包情况例子

 1  <script>
 2         var arr  = [10,20,30];
 3 
 4         // 平常的for循环i在for的括号内创建
 5        /* for (var i = 0; i < arr.length; i++) {
 6           arr[i] = function () {
 7               console.log(i);
 8           }
 9 
10         }
11         arr[0](); //输出 3*/
12 
13 
14         // 这个就相当于在外面创建了一个i变量,在for循环里面使用了而已
15 /*        var i = 0;
16         for (; i < arr.length; i++) {
17             arr[i] = function () {
18                 console.log(i);
19             }
20 
21         }*/
22 
23 //        arr[0](); //输出 3 在执行的这一刻,问一下i是多少
24 //        alert(i); // 输出3
25 
26 
27         //--------------------例子2-------------------------
28         console.log(111);
29         var i = 0;
30         // for循环在我们发布的那一刻就已经执行完毕
31         for (; i < 3; i++) {
32           // 定时器其实在for循环完了的最后一刻才执行
33           setTimeout(function () {
34               console.log(i);  // 输出3
35           },1000);
36         }
37 
38         console.log(222);
39     </script>

三.闭包与非闭包的区别例子

 1  <script>
 2         // 没有形成闭包,里面的函数没有使用外部的函数变量
 3  /*       var name = "The Window";
 4         var object = {
 5             name: "My Object",
 6             getNameFunc:function () {
 7                 console.log(this); // 得到 object
 8                 return function () {
 9                     // 这里的this呢?
10                     console.log(this); //在调用的那一刻变成window
11                     return this.name;
12                 }
13             }
14         };
15 
16         console.log(object.getNameFunc()());
17         // object.getNameFunc()运行得到function*/
18 
19 //形成闭包,里面的函数使用了外部的函数变量
20  var name = "The Window";
21  var object = {
22      name: "My Object",
23      getNameFunc:function () {
24          // 把外面的this保存到局部变量that里
25         var that = this;
26          return function () {
27              // 被嵌套的函数调用了局部变量 that  这里形成了闭包,
28              // 所以that变量不会被回收,一直保存着外面的对象。
29              return that.name;
30          }
31      }
32  };
33 
34  console.log(object.getNameFunc()());
35 </script>

 

posted @ 2017-10-30 16:07  QinXiao.Shou  阅读(183)  评论(0编辑  收藏  举报