闭包
1.闭包是什么?
- (1)闭包是使用其他函数内部的变量的函数
- (2)函数=函数+其他函数的内部变量
- (3)函数=函数+上下文引用 2.闭包的作用:解决全局变量污染
function fn(){
let a = 1
//在fn1函数中, 访问了其他函数fn内部的变量。 fn1 + a 形成闭包
function fn1(){
console.log(a)
}
fn1()
}
fn()
递归
1.递归是什么?
- 在函数内部调用自己 2.递归的作用
- 浅拷贝与深拷贝
- 遍历DOM树
//递归
let i = 1
function fn(){
if(i<=3){
console.log('热爱大前端')
i++
fn()//递归
}
}
fn()
浅拷贝与深拷贝
- 浅拷贝:拷贝地址,修改拷贝后的数据,原数据也会变化
//声明一个对象
//拷贝: 把对象中存储的数据 拷贝一份赋值给其他对象
let obj = {
name:'我彭于晏',
age:30,
hobby:['睡觉','睡觉','打豆豆'],
friend:{
name:'朋友',
sex:'男'
}
}
//浅拷贝: 拷贝的是地址
let obj1 = obj
//由于浅拷贝,拷贝的是地址。 所以修改拷贝后的数据,原来的数据也会变化
obj1.hobby = '美食'
console.log(obj1,obj)
- 深拷贝:拷贝数据,修改拷贝后的数据,原数据也不会变化
- 推荐 json : let obj = JSON.parse( JSON.stringify( 对象 ) )
//声明一个对象
//拷贝: 把对象中存储的数据 拷贝一份赋值给其他对象
let obj = {
name:'我彭于晏',
age:30,
hobby:['睡觉','睡觉','打豆豆'],
friend:{
name:'朋友',
sex:'男'
}
}
let newObj = JSON.parse( JSON.stringify( obj ) )
newObj.friend = '胡歌'
console.log(newObj,obj)
- 递归
思路:
(1)遍历obj,把所有的属性添加给newObj
(2)如果obj[key]是引用类型(数组、对象),则不能直接拷贝地址
(2.1)数组:给newObj声明一个空数组,然后遍历obj[key],把里面元素添加给newObj[key]
(2.2)对象:给newObj声明一个空对象,然后遍历obj[key],把里面元素添加给newObj[key]
(3)如果obj[key]不是引用类型,则直接赋值。结束递归