Loading

09闭包与作用域

  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 </html>

 

posted @ 2022-08-13 14:05  云起时。  阅读(38)  评论(0编辑  收藏  举报