|
|
@@ -0,0 +1,74 @@
|
|
|
+<!DOCTYPE html>
|
|
|
+<html lang="en">
|
|
|
+<head>
|
|
|
+ <meta charset="UTF-8">
|
|
|
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
|
+ <title>Document</title>
|
|
|
+</head>
|
|
|
+<body>
|
|
|
+ <script>
|
|
|
+ // 全局作用域 :在函数外部定义的变量 可以在任何地方访问
|
|
|
+ // 局部作用域 :在函数内部定义的变量 只能在函数内部访问
|
|
|
+ // 块作用域 :在块级作用域内部定义的变量 只能在块级作用域内部访问 只要使用{ } 就是块级作用域 例如:for循环 、if语句
|
|
|
+
|
|
|
+ // 使用var 只分为全局作用域和局部作用域(函数内定义与函数外定义 没有其他情况)
|
|
|
+ // if(true){
|
|
|
+ // var a = 10;
|
|
|
+ // }
|
|
|
+ // console.log(a);
|
|
|
+
|
|
|
+ // function fun(){
|
|
|
+ // // 函数内部定义的变量 只能在函数内部访问
|
|
|
+ // var a = 10;
|
|
|
+ // }
|
|
|
+ // fun();
|
|
|
+ // 函数外不能访问函数内部定义的变量
|
|
|
+ // console.log(a);
|
|
|
+
|
|
|
+
|
|
|
+ // 使用let、 const 定义的变量 可以生成块作用域
|
|
|
+ // if(true){
|
|
|
+ // let a = 10;
|
|
|
+ // }
|
|
|
+ // console.log(a);
|
|
|
+
|
|
|
+ // es6之前使用闭包实现块级作用域
|
|
|
+
|
|
|
+ // 闭包:函数嵌套函数 且内部函数可以访问外部函数的变量
|
|
|
+ // 闭包的作用:1、保存变量不会释放 2、可以实现私有变量
|
|
|
+
|
|
|
+
|
|
|
+ // var a = 10;
|
|
|
+ // console.log(a);
|
|
|
+ // 如果js发现这个变量后续没有被继续使用 则会自动释放(垃圾回收机制)
|
|
|
+ // .....
|
|
|
+
|
|
|
+ // function fun(username){
|
|
|
+ // var a = [];
|
|
|
+ // a.push(username);
|
|
|
+ // console.log(a);
|
|
|
+ // }
|
|
|
+ // fun("张三");
|
|
|
+ // fun("李四");
|
|
|
+ // 以上函数的问题:每次调用函数 函数执行完毕 会将变量a释放 (因为局部作用域内没有再次使用a变量);
|
|
|
+ // 解决方法:使用闭包
|
|
|
+
|
|
|
+ function fun1(){
|
|
|
+ var a = [];
|
|
|
+ function fun2(username){
|
|
|
+ a.push(username);
|
|
|
+ console.log(a);
|
|
|
+ }
|
|
|
+ return fun2;
|
|
|
+ }
|
|
|
+
|
|
|
+ var fun3 = fun1();
|
|
|
+ // console.log(fun3);
|
|
|
+ fun3("张三");
|
|
|
+ fun3("李四");
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ </script>
|
|
|
+</body>
|
|
|
+</html>
|