4.16-day3-JS进阶

目录

  1. 回顾js基础阶段内容
  2. 作用域
  3. 函数
  4. 解构赋值

作用域

全局作用域

目标: 知道什么是全局作用域,及全局作用域的特点

  • 全局作用域: 在javaScript中,函数外部的所有作用范围都称为全局作用域
  • 全局变量: 在全局作用域中定义的变量,叫全局变量
  • 全局变量特点: 在全局作用域中的全局变量可以在任何地方被访问到
    ```javascript //变量a是一个全局变量 let a = 123; //函数fn是一个全局变量 function fn() {} //数组ary是一个全局变量 let ary = []

//全局作用域:在全局作用域下声明的变量 //特点:全局变量在任何地方(script标签内部,函数内部) 都可以进行 获取 赋值; // 全局变量;全局函数 // demo1 let a = 10 //全局变量 function fn() { a = 20 } fn() console.log(a); //10?20==20

  1. ###局部作用域(函数作用域)
  2. > 目标: 知道什么是局部作用域及局部作用域的特点
  3. 1. 局部作用域: 在函数内部形成的作用范围称为局部作用域或者函数作用域
  4. 2. 局部变量: 在局部作用域中定义的变量称为局部变量
  5. 3. 局部变量特点: 局部变量只能在当前作用域中被访问
  6. 4. 局部作用域和全局作用域之间的关系
  7. ```javascript
  8. //练习1:
  9. let a = 10;
  10. function fn() {
  11. let a = 20
  12. console.log(a); //打印局部
  13. }
  14. fn() //打印a,局部a!有限使用作用域声明变量:20
  15. console.log(a); //当前作用下a:10-----打印全局
  16. //练习2:
  17. let a = 10
  18. function fn(a) {
  19. a = 20
  20. }
  21. fn() //打印局部的20
  22. console.log(a); //打印全局的a:10
  23. //练习3:
  24. let a = 10
  25. function fn(a) {
  26. a = 20
  27. }
  28. fn(a) //函数:形参和实参 ; 实参a:10 形参a,没有任何关系
  29. // 唯一的关系,形参局部 a=实参全局a;赋值,赋值!
  30. console.log(a); //全局a:10
  31. //综合练习4:
  32. let a = 10
  33. function fn() {
  34. a = 20;
  35. console.log(a);
  36. }
  37. fn(a) //20 //赋值 负值
  38. console.log(a); //20
  39. //局部变量 :1.函数内部
  40. // 2.形参 或 let

块级作用域

目标: 知道什么是块级作用域

  • 块级作用域: 在javaScript中,通过let关键字定义变量且位于{}中,就会形成块级作用域
  • 块级作用域特点: 变量只能在当前块级作用域中被访问
  • ```javascript // 块级 :{ } for(){} // let 声明变量
    1. if (true) {
    2. let a = 10
    3. }
    4. console.log(a);

for (let i = 0; i < 10; i++) { console.log(i); }

console.log(‘循环外部:’ + i);

// js组成部分 // 语法: ES5(var, 没有块级作用域) ES6(let模板字符串) for (var i = 0; i < 10; i++) { console.log(i); } console.log(i); // 10

  1. <a name="38e69ba9"></a>
  2. #### 案例-块级作用域
  3. ```html
  4. <input type="button" value="a">
  5. <input type="button" value="b">
  6. <input type="button" value="c">
  7. //1.获取DOM节点
  8. let btn = document.querySelectorAll("input") //伪数组
  9. //2.添加事件监听
  10. for (let i = 0; i < btn.length; i++) {
  11. //形成四个单独块级作用域
  12. // console.log(i);
  13. btn[i].addEventListener("click", function () {
  14. console.log(i);
  15. })
  16. }
  17. //不能形成块级作用域
  18. // for (var i = 0; i < btn.length; i++) {
  19. // // 没有块级作用域概念,循环四次,i:4
  20. // btn[i].addEventListener("click", function () {
  21. // console.log(i);
  22. // })
  23. // }

作用域链

目标: 知道什么是作用域链及作用域链作用

  • 作用域链: 在javaScript中,多个作用域嵌套形成的一个链状结构 anli
  • 作用域链作用: 通过作用域链进行变量查找

闭包

目标: 知道什么是闭包函数及闭包的作用是什么

  1. //函数:
  2. //声明:function fn(){}
  3. // 函数表达式
  4. //应用:自调用函数,多个功能,主动写子调用函数,防止变量污染
  5. (function () {
  6. let a=10
  7. })()
  8. //***************************************************************************
  9. //应用2:递归函数,函数内部再一次调用一次自己
  10. function fn() {
  11. console.log(1);
  12. fn()
  13. }
  14. fn() //死循环 */
  • 闭包: 闭包就是能够读取其他函数内部变量的函数
  • 闭包本质: 闭包就是一个函数,但是不是所有的函数都是闭包
  • 闭包作用: 可以延长变量的使用生命周期,避免变量污染
  • 闭包总结:
    1. 闭包本质上就是一个函数
    2. 闭包函数就是在一个函数中访问另外一个函数中的变量
    3. 闭包函数的作用延长了变量的使用生命周期
  1. //闭包:
  2. //1.基本形式 函数内部A 还有其他函数B
  3. //2.函数B内部 使用 函数A的局部变量
  4. //特点:
  5. //常规:函数内部的局部变量,如果执行完函数,发现没有其他地方用到这个变量,会被销毁!
  6. //闭包:函数B内部 要用到 函数局部变量A的话 此时局部变量A不会被消耗
  7. // 页面中出现多个闭包,内存很多空间,存储一个不能被消耗变量值
  8. -----------------------------------------------------------------------------------
  9. //课堂练习:
  10. <button id="right">正确任务</button>
  11. <button id="wrong">错误任务</button>
  12. //闭包
  13. (function () {
  14. var numb = 10
  15. var right = document.querySelector("#right")
  16. right.addEventListener("click", function () {
  17. numb += 10
  18. console.log(numb); //20
  19. })
  20. var wrong = document.querySelector("#wrong")
  21. wrong.addEventListener("click", function () {
  22. numb -= 5;
  23. console.log(numb); //15
  24. })
  25. })();
  26. //ES6 块级作用域:
  27. if (true) {
  28. let num = 10
  29. let right = document.querySelector("#right")
  30. right.addEventListener("click", function () {
  31. num += 10
  32. console.log(num); //20
  33. })
  34. let wrong = document.querySelector("#wrong")
  35. wrong.addEventListener("click", function () {
  36. num -= 5;
  37. console.log(num); //15
  38. })
  39. }

const关键字

目标: 能够知道什么是const关键字及作用

  • const关键字: 在程序中定义常量的关键字
  • const关键字注意事项 :
    1. const定义常量时候必须设置初始值
    2. const定义常量后,常量的值不能被修改
    3. const定义常量名不能重复
    4. const可以产生块级作用域
  1. //const关键词
  2. //1.常量,初始化必须有赋值
  3. // const a = 10
  4. //2.固定的值,不能被修改
  5. // a = 20
  6. // console.log(a);
  7. //3.和let一样,不能重名,var
  8. //4.形成块级作用域
  9. if (true) {
  10. const a = 20
  11. }
  12. console.log(a);

变量,函数提升

  1. 目标: 能够理解什么是变量提升和函数提升
  • 变量提升: 使用var关键字定义变量的时候,程序会先将变量的声明提升到当前作用域的开始,不包括赋值
  • 函数提升: 定义函数的时候,程序会将函数的声明提升到当前作用域的开始位置,不包括函数的调用
  • let不存在变量提升
  1. //变量和函数提升;
  2. //ES6 let 使用:先声明,在使用!
  3. // let a=10
  4. // console.log(a);
  5. //ES5 var声明:提升,为了解释看到不合理
  6. // var声明变量,代码执行之前,豫解析(会提升到当前作用域最顶端)
  7. console.log(a);
  8. var a = 10 //undefined
  9. //***********小案例*******************
  10. var a = 10 //undefined
  11. function fn() {
  12. console.log(a);
  13. var a = 20;
  14. console.log(a);
  15. }
  16. fn() //20
  17. console.log(a); //10
  18. //***********解析后*******************
  19. var a;
  20. // ------------------------------
  21. a = 10; //undefined
  22. function fn() {
  23. console.log(a);
  24. var a = 20
  25. console.log(a);
  26. }
  27. fn() //20
  28. console.log(a); //10
  29. </script>

函数

函数参数默认值

目标: 知道 函数中的参数可以设置默认值

  1. 函数中的形参可以设置默认值,函数中的形参本质就是一个变量,可以直接默认赋值
  2. 函数中的形参如果设置了默认值,在没有设置实参的情况下,就是默认值,否则就是实参的值
  1. <script>
  2. function fn(a,b) {
  3. console.log(a, b);
  4. }
  5. fn()
  6. function fn2(a = 1, b = 2) {
  7. console.log(a, b);
  8. }
  9. fn2()
  10. </script>

函数中arguments

目标: 知道 arguments的作用

  1. arguments是函数中用来保存实参信息的一个数组
  2. 当函数中实参个数不确定的时候,可以通过arguments获取实参信息
  1. //需求:封装一个函数,求两个数的和
  2. function getSum(a, b) {
  3. //1.形参?调用的时候是否传入实参!
  4. //2.返回值?调用的时候,是否需要得到结果
  5. return a + b
  6. }
  7. console.log(getSum(10, 20));
  8. -------------------------------------------------------------------------------
  9. // 需求: 封装一个函数, 求多个数字的和
  10. function getSum() {
  11. //接受一个不确定个数这些参数
  12. //1.函数内部内置变量,接受不确定个数实参
  13. //2.不需要声明,不需要写形参位置;
  14. // console.log(arguments); //伪数组,可以按照for使用
  15. let sum = 0
  16. for (let i = 0; i < arguments.length; i++) {
  17. sum += arguments[i]
  18. }
  19. return sum;
  20. }
  21. let res = getSum(10, 20.55, 66, 77, 88)
  22. console.log(res);

函数中剩余参数

目标: 知道 函数剩余参数的用法

  1. 语法: …自定义参数名
  2. 作用: 用来获取多余的实参值 (类似于arguments)
  3. 注意事项:
    1. 剩余参数必须写到函数形参的最后
    2. 剩余参数的名字是自定义的
    3. 剩余参数保存的值是以数组形式保存的
  1. //ES6:函数剩余参数
  2. function fn(...arr) {
  3. //得到数组,...代表来都多少数据我全收了,给后面变量arr
  4. console.log(arr);
  5. }
  6. fn(10, 55, 66, 89, 45)
  7. ****************************************
  8. //求最大值,最小值
  9. let arr = [10, 20, 30, 99]
  10. //求最大值,逗号隔开
  11. let max = Math.max(...arr)
  12. let min = Math.min(...arr)
  13. console.log(`最大值:${max}`); //99
  14. console.log(`最小值:${min}`); //10
  15. //区别:就是看...位置

箭头函数

目标: 知道 箭头函数的写法及注意事项

  1. 箭头函数语法1: () => {} 等价于 function() {}
  2. 函数的组成
    1. 函数名 () =>{}
    2. 参数
    3. 函数体
    4. 返回值
  1. 箭头函数注意事项:
    1. 如果只有且只有一个参数,可以省略()
    2. 如果函数体只有一行代码,可以省略{}
    3. 如果函数只有一行代码,返回值return 可以省略
  1. //箭头函数:ES6对函数简单写法!
  2. // let fn = () => { }
  3. //只有一个形参:可以省略()
  4. let fn = a => {
  5. console.log(a);
  6. let sum = a + a
  7. console.log(sum);
  8. }
  9. fn(10);
  10. //函数题:只有一句代码,可以省略{ }
  11. let fn = a => console.log(a); fn(100) //100
  12. //如何函数体内部需要返回值,而且只是一句代码:return 也可以省略
  13. let fn2 = b => b * b
  14. console.log(fn2(20)); //400