4.16-day3-JS进阶
目录
- 回顾js基础阶段内容
 - 作用域
 - 函数
 - 解构赋值
 
作用域
全局作用域
目标: 知道什么是全局作用域,及全局作用域的特点
- 全局作用域: 在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. 局部变量特点: 局部变量只能在当前作用域中被访问4. 局部作用域和全局作用域之间的关系```javascript//练习1:let a = 10;function fn() {let a = 20console.log(a); //打印局部}fn() //打印a,局部a!有限使用作用域声明变量:20console.log(a); //当前作用下a:10-----打印全局//练习2:let a = 10function fn(a) {a = 20}fn() //打印局部的20console.log(a); //打印全局的a:10//练习3:let a = 10function fn(a) {a = 20}fn(a) //函数:形参和实参 ; 实参a:10 形参a,没有任何关系// 唯一的关系,形参局部 a=实参全局a;赋值,赋值!console.log(a); //全局a:10//综合练习4:let a = 10function fn() {a = 20;console.log(a);}fn(a) //20 //赋值 负值console.log(a); //20//局部变量 :1.函数内部// 2.形参 或 let
块级作用域
目标: 知道什么是块级作用域
- 块级作用域: 在javaScript中,通过let关键字定义变量且位于{}中,就会形成块级作用域
 - 块级作用域特点: 变量只能在当前块级作用域中被访问
 - ```javascript
//  块级 :{ }  for(){}
//  let 声明变量
if (true) {let a = 10}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
<a name="38e69ba9"></a>#### 案例-块级作用域```html<input type="button" value="a"><input type="button" value="b"><input type="button" value="c">//1.获取DOM节点let btn = document.querySelectorAll("input") //伪数组//2.添加事件监听for (let i = 0; i < btn.length; i++) {//形成四个单独块级作用域// console.log(i);btn[i].addEventListener("click", function () {console.log(i);})}//不能形成块级作用域// for (var i = 0; i < btn.length; i++) {// // 没有块级作用域概念,循环四次,i:4// btn[i].addEventListener("click", function () {// console.log(i);// })// }
作用域链
目标: 知道什么是作用域链及作用域链作用
- 作用域链: 在javaScript中,多个作用域嵌套形成的一个链状结构 anli
 - 作用域链作用: 通过作用域链进行变量查找
 
闭包
目标: 知道什么是闭包函数及闭包的作用是什么
//函数://声明:function fn(){}// 函数表达式//应用:自调用函数,多个功能,主动写子调用函数,防止变量污染(function () {let a=10})()//***************************************************************************//应用2:递归函数,函数内部再一次调用一次自己function fn() {console.log(1);fn()}fn() //死循环 */
- 闭包: 闭包就是能够读取其他函数内部变量的函数
 - 闭包本质: 闭包就是一个函数,但是不是所有的函数都是闭包
 - 闭包作用: 可以延长变量的使用生命周期,避免变量污染
 - 闭包总结: 
- 闭包本质上就是一个函数
 - 闭包函数就是在一个函数中访问另外一个函数中的变量
 - 闭包函数的作用延长了变量的使用生命周期
 
 
//闭包://1.基本形式 函数内部A 还有其他函数B//2.函数B内部 使用 函数A的局部变量//特点://常规:函数内部的局部变量,如果执行完函数,发现没有其他地方用到这个变量,会被销毁!//闭包:函数B内部 要用到 函数局部变量A的话 此时局部变量A不会被消耗// 页面中出现多个闭包,内存很多空间,存储一个不能被消耗变量值-----------------------------------------------------------------------------------//课堂练习:<button id="right">正确任务</button><button id="wrong">错误任务</button>//闭包(function () {var numb = 10var right = document.querySelector("#right")right.addEventListener("click", function () {numb += 10console.log(numb); //20})var wrong = document.querySelector("#wrong")wrong.addEventListener("click", function () {numb -= 5;console.log(numb); //15})})();//ES6 块级作用域:if (true) {let num = 10let right = document.querySelector("#right")right.addEventListener("click", function () {num += 10console.log(num); //20})let wrong = document.querySelector("#wrong")wrong.addEventListener("click", function () {num -= 5;console.log(num); //15})}
const关键字
目标: 能够知道什么是const关键字及作用
- const关键字: 在程序中定义常量的关键字
 - const关键字注意事项  : 
- const定义常量时候必须设置初始值
 - const定义常量后,常量的值不能被修改
 - const定义常量名不能重复
 - const可以产生块级作用域
 
 
//const关键词//1.常量,初始化必须有赋值// const a = 10//2.固定的值,不能被修改// a = 20// console.log(a);//3.和let一样,不能重名,var//4.形成块级作用域if (true) {const a = 20}console.log(a);
变量,函数提升
目标: 能够理解什么是变量提升和函数提升
- 变量提升: 使用var关键字定义变量的时候,程序会先将变量的声明提升到当前作用域的开始,不包括赋值
 - 函数提升: 定义函数的时候,程序会将函数的声明提升到当前作用域的开始位置,不包括函数的调用
 - let不存在变量提升
 
//变量和函数提升;//ES6 let 使用:先声明,在使用!// let a=10// console.log(a);//ES5 var声明:提升,为了解释看到不合理// var声明变量,代码执行之前,豫解析(会提升到当前作用域最顶端)console.log(a);var a = 10 //undefined//***********小案例*******************var a = 10 //undefinedfunction fn() {console.log(a);var a = 20;console.log(a);}fn() //20console.log(a); //10//***********解析后*******************var a;// ------------------------------a = 10; //undefinedfunction fn() {console.log(a);var a = 20console.log(a);}fn() //20console.log(a); //10</script>
函数
函数参数默认值
目标: 知道 函数中的参数可以设置默认值
- 函数中的形参可以设置默认值,函数中的形参本质就是一个变量,可以直接默认赋值
 - 函数中的形参如果设置了默认值,在没有设置实参的情况下,就是默认值,否则就是实参的值
 
<script>function fn(a,b) {console.log(a, b);}fn()function fn2(a = 1, b = 2) {console.log(a, b);}fn2()</script>
函数中arguments
目标: 知道 arguments的作用
- arguments是函数中用来保存实参信息的一个数组
 - 当函数中实参个数不确定的时候,可以通过arguments获取实参信息
 
//需求:封装一个函数,求两个数的和function getSum(a, b) {//1.形参?调用的时候是否传入实参!//2.返回值?调用的时候,是否需要得到结果return a + b}console.log(getSum(10, 20));-------------------------------------------------------------------------------// 需求: 封装一个函数, 求多个数字的和function getSum() {//接受一个不确定个数这些参数//1.函数内部内置变量,接受不确定个数实参//2.不需要声明,不需要写形参位置;// console.log(arguments); //伪数组,可以按照for使用let sum = 0for (let i = 0; i < arguments.length; i++) {sum += arguments[i]}return sum;}let res = getSum(10, 20.55, 66, 77, 88)console.log(res);
函数中剩余参数
目标: 知道 函数剩余参数的用法
- 语法: …自定义参数名
 - 作用: 用来获取多余的实参值 (类似于arguments)
 - 注意事项: 
剩余参数必须写到函数形参的最后剩余参数的名字是自定义的剩余参数保存的值是以数组形式保存的
 
//ES6:函数剩余参数function fn(...arr) {//得到数组,...代表来都多少数据我全收了,给后面变量arrconsole.log(arr);}fn(10, 55, 66, 89, 45)****************************************//求最大值,最小值let arr = [10, 20, 30, 99]//求最大值,逗号隔开let max = Math.max(...arr)let min = Math.min(...arr)console.log(`最大值:${max}`); //99console.log(`最小值:${min}`); //10//区别:就是看...位置
箭头函数
目标: 知道 箭头函数的写法及注意事项
- 箭头函数语法1: () => {} 等价于 function() {}
 - 函数的组成 
- 函数名    
() =>{} - 参数
 - 函数体
 - 返回值
 
 - 函数名    
 
- 箭头函数注意事项: 
如果只有且只有一个参数,可以省略()如果函数体只有一行代码,可以省略{}如果函数只有一行代码,返回值return 可以省略
 
//箭头函数:ES6对函数简单写法!// let fn = () => { }//只有一个形参:可以省略()let fn = a => {console.log(a);let sum = a + aconsole.log(sum);}fn(10);//函数题:只有一句代码,可以省略{ }let fn = a => console.log(a); fn(100) //100//如何函数体内部需要返回值,而且只是一句代码:return 也可以省略let fn2 = b => b * bconsole.log(fn2(20)); //400
