作用域:scope规定了作用的范围
局部作用域
全局作用域
1.1局部作用域
1.1函数作用域
在函数内部声明的变量,只能在函数内部使用
1.2块作用域
只在js代码块{}中起作用
全局作用域
作用域链
本质上是底层查找机制
在函数被执行时,优先查找最近的函数域
如果查找不到,会逐渐查找父级作用域,只到全局作用域
1.4垃圾回收机制
回收不被使用的内存
内存的生命周期
声明内存:声明对象时,系统会自动分配一块内存出来
使用内存:使用对象或者函数时,会使用内存
回收内存:使用完毕时,垃圾回收器,会回收不在使用的内存
注,全局变量,一般不会被回收,局部变量不用就会被回收
内存泄漏机制,一般由于某些错误,导致内存无法被回收(未释放或者无法释放的机制)
常见的垃圾回收算法:
引用计数法
定义,内容不在使用,即看一个对象是否有指向他的引用,没有就进行回收
跟踪记录他的引用次数,有引用就加1,没有引用就减一如果引用次数为0就释放内存
如果对象相互引用,导致对象无法进行回收
标记清除法
将不在使用的对象,定义为无法到达的对象
就是从根部出发时,定时扫描内存中的对象,凡是从根部到达的对象,根还是需要使用的
那些无法由根部出发,触及到的标记为为不在使用,然后进行回收
JS闭包
一个函数,对周围状态的引用,捆绑在一起,内层函数中访问到其他外层函数的作用域。
简单理解:闭包==内层函数+加外层函数的变量
闭包的应用:实现数据的私有
比如,做一个统计函数调用的次数,函数调用一次就++
但闭包可能会引起内存泄漏
变量提升
js缺点,仅存在var中
定义,把所有var 声明的变量提升到当前作用域的最前面,但不赋值
函数进阶
函数提升
在声明之前就可以被调动
函数提升使函数的调用更加的灵活
函数表达式不存在提升现象
函数提升出现在相同作用域上
2.2 函数参数
动态参数
arguments 是函数内部内置的伪数组变量,它包含了调用函数时传入的所有参数
剩余参数
...是语法符号,置于最末函数形参之前,用于获得多余的参数
借助。。。获取多余实参,是个真数组
动态参数是伪数组
开发中,还是提倡多使用剩余参数
展开运算符
展开运算法(...)将一个数组进行展开
说明不会修改原数组
主要求数组的最大值和合并数组
箭头函数
目的,引入箭头函数是更简单的函数写法,并且不绑定this,箭头函数的写法,比函数表达式更加的简洁
使用场景:箭头函数更加适用于那些本来需要匿名函数的地方
fn(c参数)=>{}只有一个形参可以省略小括号,只有一行代码可以省略大括号,return
箭头函数,可以直接返回一个对象
箭头函数,没有this去找上一级
解构赋值
数组解构
将单元值,快速批量赋值给一系列变量的简洁语法
const arr【max,min,avg】=[a,b,c]
js里面必须加分号的情况
立即执行函数
使用数组的情况
对象解构
将对象里面的对象属性和方法快速赋值给一系列对象的简洁语法
赋值运算符 =左侧{}用于批量生明变量,右面对象的属性值,将会赋值给左面变量
多级对象解构
const {name,family:{mother,brother,sister}}=pig
遍历数组foreach遍历数组中的每一个元素
arr.foreach{function(item,index)
}
foreach不返回值