一、作用域
1、函数内部声明的变量,在函数外部无法被访问
2、函数的参数也就是函数内部的局部变量
3、不同函数内部声明的变量无法互相访问、
4、函数执行完毕后,函数内部的变量实际被清空了
作用域分为全局作用域和局部作用域,局部作用域分为函数作用域和块级作用域
1.1 块作用域:
{}包裹的代码称为代码块,代码内部声明的变量外部(有可能)无法被访问
1.let、const声明的变量会产生块作用域,var不会产生块作用域
2.不同代码块之间的变量无法访问
3.推荐使用let 或const
1.2全局作用域:
<script>标签和<.js>文件的最外层就是全局作用域,在此声明的变量在函数内部也可以访问
全局作用域声明的变量,其他作用域都可以访问
1.3作用域链:
作用域链底层是变量的查找机制
1、在函数被执行时,会优先在当前函数作用域中查找变量
2、如果当前作用域中查找不到则会依次逐级查找父级作用域直至全局作用域
1.4垃圾回收机制
垃圾回收机制分为两种方法:引用计数法和标记清除法
1.引用计数法:跟踪被引用的次数,引用一次计数+1,少引用一次-1,如果引用次数为0则释放内存
2.标记清除法的核心思路是从根部扫描对象,能查找到的就是使用的,查找不到的就要回收
1.5闭包
闭包=内层函数+外层函数的变量
作用:1.封闭函数,实现数据私有,外部也可以访问函数内部的变量
2.闭包很有用,因为它允许函数与其所操作的某些数据(环境)关联起来
闭包可能引起的问题:内存泄漏
1.6变量提升
var 有变量提升,let const没有变量提升
流程:1.先把var声明的变量提升到当前作用域最前面
2.只提升变量声明,不提升变量赋值
3.然后依次执行代码
不建议使用var
2.1函数提升
1、函数声明提升,函数调用不提升
2、函数提升能使函数调用更灵活,函数表达式不存在变量提升
3、函数提升出现在相同作用域当中
2.2函数参数
1、动态参数:当不确定传递多少实参的时候,我们用arguments动态参数,arguments是伪数组,它只存在于函数中。
2、剩余参数(...arr形式):主要用于获取多余的实参,剩余参数是真数组,开发中提倡使用。
3.展开运算符(...)可以把数组展开,可以利用求数组最大值以及合并数组等操作。剩余参数和展开运算符的区别:展开运算法是数组展开,剩余参数在函数内部使用。
2.3箭头函数
1.箭头函数属于表达式函数,因此不存在变量提升
2.箭头函数只有一个可以省略圆括号()
3.箭头函数函数体只有一行时可以省略花括号{},并且自动作为返回值被返回
4.加括号的函数体返回对象字面量表达式
5.箭头函数不会创建自己的this,它只会从自己作用域链的上一层沿用this
2.4数组结构
1.数组解构赋值的作用:将数组的单元值快速批量赋值给一系列变量的简洁语法
2.js哪两种情况需要加分号?立即执行函数,数组解构
3.当变量的数量大于单元值数量时,多余的变量将被赋值为undefined。变量的数量小于单元值数量时,可以使用剩余参数...获取剩余单元值,但只能置于最末位
2.5异常处理
1、抛出异常用throw关键字,它会终止程序
2、Error对象配合throw使用
3、try...catch用于捕获错误信息,将预估可能发生错误的代码写在try代码段中,如果try代码段中出现错误,会执行catch代码段,并截获到错误信息。finally不管是否有错误,都会执行。
2.6普通函数和箭头函数this的指向
this的指向:普通函数谁调用 this就指向谁,严格模式下指向undefined。箭头函数内部不存在this,沿用上一级的,向外层作用域中一层一层查找this,直到有this的定义。不适用构造函数、原型函数、DOM事件等,适用需要使用上层this的地方
2.7 call,apply,bind总结
相同点:都可以改变函数内部this的指向
不同点:1.call和apply会调用函数,并且改变函数内部this的指向
2.call和apply传递的参数不一样,call传递参数aru1,aru2形式,apply必须数组形式[arg]
3.bind不会调用函数,会改变函数内部this的指向
2.8防抖和节流
1.防抖单位时间内,频繁触发事件,只执行最后一次。节流是单位时间内,频繁触发事件,只执行一次。
2.使用场景:防抖:适用于搜索输入、手机号.邮箱验证输入检测
节流:适用于高频事件,比如鼠标移动mounsemove,页面缩放resize,滚动条滚动scroll等
2.9原型
1.原型是一个对象,我们也称propotype为原型对象。在js中,每一个函数类型的数据,都有一个叫做prototype的属性,这个属性指向的是一个对象,就是所谓的原型对象。
2.原型的作用:最主要的作用就是用来存放实例对象的公有属性和公有方法。
3。构造函数和原型里的this指向实例化的对象