JavaScript高级知识回顾

82 阅读1分钟

闭包Closure

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

闭包.PNG

递归

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]不是引用类型,则直接赋值。结束递归