JS高级的第一天
全局作用域
全局作用域: 在javaScript中,函数外部的所有作用范围都称为全局作用域
全局变量: 在全局作用域中定义的变量,叫全局变量
全局变量特点: 在全局作用域中的全局变量可以在任何地方(script标签内部、函数内部)被访问到
局部作用域
局部作用域: 在函数内部形成的作用范围称为局部作用域或者函数作用域
局部变量: 在局部作用域中定义的变量称为局部变量
局部变量特点: 局部变量只能在当前作用域中被访问
综合案例1
综合案例2
综合案例3
综合案例4
块级作用域
块级作用域: 在javaScript中,通过let关键字定义变量且位于**{}**中,就会形成块级作用域
块级作用域特点: 变量只能在当前块级作用域中被访问
var中没有块级作用域 只执行公共的i
作用域链
作用域链: 在javaScript中,多个作用域嵌套形成的一个链状结构
作用域链作用: 通过作用域链进行变量查找
const关键字
const关键字: 在程序中定义常量的关键字
const关键字注意事项:
const定义常量时候必须设置初始值
const定义常量后,常量的值不能被修改
const定义常量名不能重复
const可以产生块级作用域
变量,函数提升
变量提升: 使用var关键字定义变量的时候,程序会先将变量的声明提升到当前作用域的开始,不包括赋值
函数提升: 定义函数的时候,程序会将函数的声明提升到当前作用域的开始位置,不包括函数的调用
let不存在变量提升
执行代码,进入新的作用域
1.不要管全局和局部,代码都不是立即执行
2.先执行预解析
3.预解析做的事件:预见var声明变量和function声明函数,提升当前作用域最顶端,这就是预解析后的代码
4.浏览器执行解析后代码
var 与let 区别
相同:都是关键字,都是用于声明变量
不同:
配合循环
let 随着循环可以形成多个块级作用域,每个循环中变换的值都属于单独某个块级作用域
var配合循环 没有块级作用域 循环完毕 循环下标变为循环长度 公共下标
let 先声明 在使用
var 可以先用 在声明 (预解析 ,执行代码 进入新的作用域 ,预见var声明变量和function声明函数 ,提升到当前作用域的最前端)
预解析:
代码执行进入新的作用域:1.找var声明的变量和function fn(){}
2.提升到当前作用域的最顶端
闭包
函数
声明1: function () {} 声明2:函数表达式
应用1:自调用函数 多个功能 主动写自调用函数 防止变量污染
(function () {
let a = 10
})()
应用2: 递归函数 函数内部会再次调用一次自己
应用3:回调函数 函数A如果作为另外一个函数B的参数传入的时候 函数A是回调函数
dom添加事件监听 click fn 回调函数
闭包: 闭包就是能够读取其他函数内部变量的函数
闭包本质: 闭包就是一个函数,但是不是所有的函数都是闭包
闭包作用: 可以延长变量的使用生命周期,避免变量污染
闭包总结:
闭包本质上就是一个函数
闭包函数就是在一个函数中访问另外一个函数中的变量
闭包函数的作用延长了变量的使用生命周期
场景
1.假设 新手 初始化账户10
2.对10 错-5 闭包
1.基本形式 函数内部A 还有其他函数B
2.函数B内部 使用 函数A的局部变量
闭包特点
常规,函数内部的局部变量 ,
如果执行完函数,发现没有其他地方用到这个函数,会被销毁
闭包:函数B内部 要用到 函数局部变量A的话,此时局部变量A不会被销毁
页面中出现多个闭包,内存很多空间都会存储不能被销毁的变量和值
尽量规避
ES5的写法
ES6的写法
函数
默认值参数
- 函数中的形参可以设置默认值,函数中的形参本质就是一个变量,可以直接默认赋值
- 函数中的形参如果设置了默认值,在没有设置实参的情况下,就是默认值,否则就是实参的值
arguments
- arguments是函数中用来保存实参信息的一个数组
- 当函数中实参个数不确定的时候,可以通过arguments获取实参信息
1.形参? 调用的时候是否需要传入实参
2.返回值? 调用的时候 是否需要得到结果
需求 封装一个函数 求多个数字的和
剩余参数
- 语法: …自定义参数名
- 作用: 用来获取多余的实参值 (类似于arguments)
- 注意事项:
3.1 剩余参数必须写到函数形参的最后
3.2 剩余参数的名字是自定义的
3.3 剩余参数保存的值是以数组形式保存的
…展开
区别:就是看…的位置 形参的位置———>收集剩余参数 其他位置————>展开
箭头函数
- 箭头函数语法1: () => {} 等价于 function() {}
- 函数的组成
2.1 函数名
2.2 参数
2.3 函数体
2.4 返回值 - 箭头函数注意事项:
3.1 如果只有且只有一个参数,可以省略()
3.2 如果函数体只有一行代码,可以省略{}
3.3 如果函数只有一行代码,返回值return 可以省略