scope
局部作用域(local)
分函数作用域和块作用域
var不会产生块作用域
全局作用域(global)
函数内部可以使用全局变量
函数内变量未声明则为全局变量
作用域链
本质上是底层变量查找机制
函数执行时,优先当前函数作用域变量;如果查不到,依次逐级查找父级作用域直到全局作用域
嵌套关系的作用域嵌套形成作用域链
子作用域能访问父作用域,父作用域不能访问子作用域
GC(垃圾回收机制)
内存生命周期
内存分配(声明变量、函数、对象时自动分配)-内存使用(读写内存,即使用函数等)-内存回收(自动回收不再使用的内存)
全局变量一般不回收,关闭网页会回收
局部变量不用就会回收
内存泄漏:内存未被回收
js回收机制:
算法1:引用计数法(循环引用时会泄漏)
算法2:标记清除法(从根部查找,找不到则删除)
闭包(closure)
闭包=内部函数+外层函数变量(必须捆绑在一起)
作用外部函数也可以访问函数内部变量
基本格式:
function outer() {
let i=1
function fn() {
console.log(i)
}
return fn
}
const fun = outer() //将 function fn() {} 给了fun
fun() //可以调用fn
应用:函数调用次数(好处是参数不被篡改,实现数据私有)会出现泄漏
变量提升(即限于var)
把所有var声明的变量提升到当前作用域最前面,只提升声明,不提升赋值
动态参数
伪数组arguments会储存传进函数中的所有参数,仅存在于函数中
剩余参数
function fn(a,d,...arr){
}
...为语法符号,在形参最后,arr是含有剩余参数的数组(在函数参数中使用)
注意:arr是真数组
展开运算符
符号为 ...,和剩余参数语法符号相同,用于展开数组,获得所有元素
箭头函数
简化函数表达式且不绑定this,从自己作用域上一层寻找this
const fn = () =>{
}
//如果只有一个参数,可写为
const fn = x =>{
}
fn(1)//调用
数组解构
将数组单元值快速批量赋值给一系列变量(支持多维数组)
const arr =[1,2,3]
const [a,b,c] = arr
可以设置默认值
例子:
交换两变量
let a=1
let b=2; //出现[]符号,需要加 ; 隔开(类似的还有立即执行函数)
[a,b] = [b,a]
对象解构
对象属性的值必须赋值给(对象)属性名相同的变量
const user = {
uname: '小明',
age: 18
}
const {uname, age} = user
可以更改解构的变量名,用冒号赋值
const user = {
uname: '小明',
age: 18
}
const {uname: name, age} = user
数组对象解构
const pig = [
{
uname:'tom',
age: 18
}
]
const [{ uname, age }] = pig
多级对象解构
指明属性
const pig = {
uname:'tom',
family: {
mother: 'one',
father: 'two'
},
num: 3
}
const {uname, family: { mother, father }} = pig
遍历数组(forEach)
调用每个元素,传递给回调函数(与map不同,不返回新数组)
const arr = ['red','green','pink']
arr.forEach (function (items, index) {
})
构造函数
用来创建对象
function People (uname, age) {
this.uname = uname
this.age = age
}
const p1 = new People('Tom', 18)
实例化过程
new的作用
1.创建新对象
2.构造函数的this指向新对象
3.执行构造函数,修改this指向的属性
4.返回新对象