闭包面试题

 1 <!DOCTYPE html>
 2 <html lang="en">
 3   <head>
 4     <meta charset="UTF-8" />
 5     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
 6     <title>Document</title>
 7   </head>
 8   <body>
 9     <script>
10       // 1.闭包无处不再,需要你去识别它。基于作用域书写代码时产生的自然结果,我们不需要为了利用它而刻意的去创建一个闭包
11       // 2.闭包是一种方式,他是一个能够引用其内部作用域变量的表达式
12       // 3.以下这个案例就是一个闭包,因为匿名函数(say)是在另外一个函数中声明的,在js中如果另一个函数使用了funtion关键字,则创建了闭包
13       // 4.在js中 如果在一个函数A中声明了另外一个函数B(出现了闭包),那么你调用了A函数以后,A里边的局部变量依然是可以被访问的
14       /* function sayHello(name) {
15         var text = name; // 局部变量text
16         var say = function () {
17           console.log(text);
18         };
19         return say;
20       }
21 
22       var say2 = sayHello("lily");
23 
24       say2(); //lily */
25 
26       //
27       /* function say667() {
28         // 局部变量num最后会保存在闭包中
29         var num = 42;
30         var say = function () {
31           console.log(num);
32         };
33         num++;
34         return say;
35       }
36       var sayNumber = say667();
37       //通常一个函数执行完成以后,整个内部的作用域都会被销毁,因为引擎有垃圾回收机制来释放不在使用的空间
38       //而闭包的神奇之处就是 可以阻止这个事情的发生,内部作用域依然存在,因为sayNumber还在使用这个作用域
39       sayNumber(); // 输出 43 */
40 
41       //
42       /* var a, b, c;
43       function fn1() {
44         // 局部变量num最后会保存在闭包中
45         var num = 42;
46         // 将一些对于函数的引用存储为全局变量
47         a = function () {
48           console.log(num);
49         };
50         b = function () {
51           num++;
52         };
53         c = function (x) {
54           num = x;
55         };
56       }
57       fn1();
58       b();
59       a(); // 43
60       c(5);
61       a(); // 5
62       var oldLog = a;
63       //在上边的案例中,当我们再次调用fn1时候,一个新的闭包就被创建了,旧闭包的变量 a b  c被新闭包的函数覆盖
64       // 每次调用fn1 都会创建一个新的闭包
65       fn1();
66       a(); // 42
67       oldLog(); // 5 */
68 
69       //
70       function buildList(list) {
71         var result = [];
72         for (var i = 0; i < list.length; i++) {  //for循环已经执行完了,此时i为3,
73           var item = "item" + i;
74           result.push(function () {
75             console.log(item + " " + list[i]);
76           });
77         }
78         return result;
79       }
80       function testList() {
81         var fnlist = buildList([1, 2, 3]);
82 
83         for (var j = 0; j < fnlist.length; j++) {
84           fnlist[j](); //打印3次  ‘item2 undefined’
85         }
86       }
87       testList();
88     </script>
89   </body>
90 </html>

 

posted @ 2020-05-29 08:25  全情海洋  阅读(1517)  评论(0编辑  收藏  举报