1 <!doctype html>
2 <html lang="en">
3 <head>
4 <meta charset="UTF-8">
5 <meta name="viewport"
6 content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
7 <meta http-equiv="X-UA-Compatible" content="ie=edge">
8 <title>09闭包与作用域</title>
9 </head>
10 <body>
11 <!--
12 0 全局变量不会被回收。
13 1 定义的函数会在被调用时在本环境中开辟一块函数内存空间,定义多个函数会开辟多个不同环境。
14 2 函数层级嵌套时,子可访问父,父不可访问子。
15 3 函数只有调用才会产生内存空间;函数调用多次,会产生多个对应的内存空间,之前不使用的会被回收;函数中定义的函数被使用,函数会被保留。
16 4 核心: 函数每执行一次就会创建一个新的内存空间;当把函数内部的函数返回给外部时能保证函数的内存空间被保留。
17 -->
18
19 <script>
20 /*9.1 函数环境生命周期*/
21 /*9.1.1 函数用完就删*/
22 // let lc = function () {
23 // let n = 1;
24 // function sum() {
25 // console.log(n=n+1);
26 // }
27 // sum();
28 // };
29 // lc(); // 2
30 // lc(); // 2
31
32 /*9.1.2 函数用完不删除*/
33 // let lc = function () {
34 // let n = 1;
35 // return function sum() {
36 // console.log(n=n+1);
37 // }
38 // };
39 // // 函数中有变量被引用
40 // let chang = lc();
41 // chang(); // 2
42 // chang(); // 3
43 // let a = lc();
44 // a(); // 2
45 // a(); // 3
46 // let b = lc();
47 // b(); // 2
48
49 /*9.1.3 嵌套中的函数示例1*/
50 // let lc = function () {
51 // return function sum() {
52 // let m = 1;
53 // function show() {
54 // console.log(m=m+1);
55 // }
56 // show();
57 // };
58 // };
59 // let chang = lc();
60 // chang(); // 2
61 // chang(); // 2
62
63 /*9.1.4 嵌套中的函数示例2*/
64 // let lc = function () {
65 // let n = 1;
66 // return function sum() {
67 // let m = 1;
68 // return function show() {
69 // console.log('m:',m=m+1);
70 // console.log('n:',n=n+1);
71 // };
72 // };
73 // };
74 // let chang = lc()();
75 // chang(); // m:2 n:2
76 // chang(); // m:3 n:3
77
78 /*9.2 构造函数中的作用域的使用*/
79 // 构造函数为每一个对象保留一份内存空间
80 // let show = function () {
81 // let n = 1;
82 // this.sum = function () {
83 // console.log(n = n + 1);
84 // };
85 // };
86 // let a = new show();
87 // a.sum(); // 2
88 // a.sum(); // 3
89 // let b = new show();
90 // b.sum(); // 2
91 // b.sum(); // 3
92
93 /*9.3 什么是块级作用域*/
94 // 块级作用域对let、const声明的变量有效,对var声明的变量无效。
95 // for循环默认带块级作用域
96 // {
97 // let a = 1;
98 // console.log(a); // 1
99 // }
100 // console.log(a); // 报错
101
102 /*9.4 闭包*/
103 /*闭包说明:
104 (1) 函数可以访问到其他函数的作用域中的数据。
105 (2) 闭包指子函数可以访问外部作用域变量的函数特性,即使在子函数作用域外也可以访问。
106 (3) JS 中的所有函数都是闭包。
107 (4) 闭包一般在子函数本身作用域以外执行,即延伸作用域。
108 */
109
110 </script>
111 </body>
112