3_块作用域.html 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  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. // 全局作用域 :在函数外部定义的变量 可以在任何地方访问
  11. // 局部作用域 :在函数内部定义的变量 只能在函数内部访问
  12. // 块作用域 :在块级作用域内部定义的变量 只能在块级作用域内部访问 只要使用{ } 就是块级作用域 例如:for循环 、if语句
  13. // 使用var 只分为全局作用域和局部作用域(函数内定义与函数外定义 没有其他情况)
  14. // if(true){
  15. // var a = 10;
  16. // }
  17. // console.log(a);
  18. // function fun(){
  19. // // 函数内部定义的变量 只能在函数内部访问
  20. // var a = 10;
  21. // }
  22. // fun();
  23. // 函数外不能访问函数内部定义的变量
  24. // console.log(a);
  25. // 使用let、 const 定义的变量 可以生成块作用域
  26. // if(true){
  27. // let a = 10;
  28. // }
  29. // console.log(a);
  30. // es6之前使用闭包实现块级作用域
  31. // 闭包:函数嵌套函数 且内部函数可以访问外部函数的变量
  32. // 闭包的作用:1、保存变量不会释放 2、可以实现私有变量
  33. // var a = 10;
  34. // console.log(a);
  35. // 如果js发现这个变量后续没有被继续使用 则会自动释放(垃圾回收机制)
  36. // .....
  37. // function fun(username){
  38. // var a = [];
  39. // a.push(username);
  40. // console.log(a);
  41. // }
  42. // fun("张三");
  43. // fun("李四");
  44. // 以上函数的问题:每次调用函数 函数执行完毕 会将变量a释放 (因为局部作用域内没有再次使用a变量);
  45. // 解决方法:使用闭包
  46. function fun1(){
  47. var a = [];
  48. function fun2(username){
  49. a.push(username);
  50. console.log(a);
  51. }
  52. return fun2;
  53. }
  54. var fun3 = fun1();
  55. // console.log(fun3);
  56. fun3("张三");
  57. fun3("李四");
  58. </script>
  59. </body>
  60. </html>