闭包、递归、深拷贝浅拷贝

什么是闭包:有权访问另一个函数作用域中变量的函数。

简单来说就是一个作用域可以访问另一个函数内部的局部变量。

闭包的作用:

  1. 隐藏变量,避免全局污染

  2. 可以读取函数内的变量

同时闭包使用不当,优点就变成了缺点:

缺点1:导致变量不会被垃圾回收机制回收,造成内存消耗

缺点2:不恰当的使用闭包可能会造成内存泄漏的问题

这里简单说一下,为什么使用闭包时变量不会被垃圾回收机制收销毁呢,这里需要了解一下
JS垃圾回收机制;

JS规定在一个函数作用域内,程序执行完以后变量就会被销毁,这样可节省内存;

使用闭包时,按照作用域链的特点,闭包(函数)外面的变量不会被销毁,因为函数会一直被调用,所以一直存在,如果闭包使用过多会造成内存销毁。

  • 基本类型储存在栈中,但是⼀旦被闭包引⽤则成为常住内存,会储存在内存堆中。
  • 复杂类型会储存在内存堆中。

自由变量的查找,是在函数定义的地方查找,向上级作用域查找,不是在执行的地方查找。
函数的this指向,函数this的确定是在函数执行的时候确认的不是在函数定义的时候确认的

 function create() {
    const a = 100
    return function() {
      console.log('a='+a)
    }
  }
  const f = create()
  const a = 200
  f() //a=100

  function print(fn) {
    const b = 300
    fn()
  }

  const b = 400
  function fn() {
    console.log('b='+b)
  }
  print(fn) //b=400

什么是递归:递归就是自己调用自己

image

深拷贝和浅拷贝

深复制和浅复制最根本的区别在于是否是真正获取了一个对象的复制实体,而不是引用。

深拷贝和浅拷贝是只针对Object和Array这样的引用数据类型的。

  • 浅复制 —-只是拷贝了基本类型的数据,而引用类型数据,复制后也是会发生引用,我们把这种拷贝叫做“(浅复制)浅拷贝”,换句话说,浅复制仅仅是指向被复制的内存地址,如果原地址中对象被改变了,那么浅复制出来的对象也会相应改变。
  • 深复制 —-在计算机中开辟了一块新的内存地址用于存放复制的对象。
    通俗一点理解就是浅拷贝出来的数据并不独立,如果被复制的对象改变了,那么浅拷贝的对象也会改变,深拷贝之后就会完全独立,与浅拷贝断绝关系。

简单的复制赋值
值类型就是深拷贝,引用类型就是浅拷贝
引用类型:对象、数组、null

1.浅拷贝:浅拷贝只是拷贝一层,更深层次的对象级别只拷贝引用

image

拷贝元素没有区别,拷贝数组、对象就是拷贝地址。

image

es6新增浅拷贝:Object.assign(拷贝给谁,拷贝的对象)

2.深拷贝:深拷贝拷贝多层,每一层级别的数据都会拷贝。

image

深拷贝会将数组和对象里面的内容再复制一份,而不是仅仅是复制地址。

image

    //递归来实现深拷贝
    function deepClone(obj){
      var newObj = obj instanceof Array ? []:{};
      if(typeof obj !== 'object'){
        return obj;
      }else {
        for(var i in obj) {
          newObj[i] = typeof obj[i] === 'object' ? deepClone(obj[i]) : obj[i];
        }
      } 
      return newObj;
    }
    
    var q = [1, 2, 4, 6, { age: 12 }, [1, 2]];
    var d = deepClone(q)
    console.log(d)
posted @ 2021-04-06 16:46  嘿!那个姑娘  阅读(120)  评论(0编辑  收藏  举报