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>