闭包Closure
<body>
<script>
function fn() {
let num = 1
function fn1() {
console.log(num)
}
fn1()
}
fn()
</script>
</body>
1.闭包(closure)是什么?
1.1 闭包是一个访问其他函数内部变量的函数
1.2 闭包 = 函数 + 上下文引用 的组合
2.闭包作用 : 变量污染

递归
1.什么是递归函数? : 函数内部调用自己
* 注意点: 需要满足条件才会递归,否则会导致死循环
* 递归函数和循环功能类似
2.递归函数应用场景 :
2.1 浅拷贝与深拷贝
浅拷贝: 拷贝的是地址, 修改拷贝后的数据对原数据有影响
深拷贝:拷贝的是数据, 修改拷贝后的数据对原数据没有影响
2.2 遍历dom树
深拷贝
深拷贝有两种实现方式
1 推荐使用:json转换
2 递归函数
1json转换
(1)先把js对象转成json格式字符串 : JSON.stringify(js对象)
json在把js转成json格式字符串的时候,底层会自动帮你深拷贝
let json = JSON.stringify(obj)
console.log( json )
(2)再把刚才的json字符串,转成js对象 : JSON.parse( json格式 )
let js = JSON.parse( json )
(3)以上两个流程,可以简写成一行代码
let newObj = JSON.parse( JSON.stringify( obj ) )
newObj.friend = '71期'
console.log(newObj,obj)
2递归函数
(1)遍历obj,把所有的属性添加给newObj
(2)如果obj[key]是引用类型(数组、对象),则不能直接拷贝地址
(2.1)数组:给newObj声明一个空数组,然后遍历obj[key],把里面元素添加给newObj[key]
(2.2)对象:给newObj声明一个空对象,然后遍历obj[key],把里面元素添加给newObj[key]
(3)如果obj[key]不是引用类型,则直接赋值。结束递归