美文网首页
高级函数(闭包,递归,深浅拷贝)

高级函数(闭包,递归,深浅拷贝)

作者: jasmine_6aa1 | 来源:发表于2020-06-12 10:06 被阅读0次

    闭包函数(closures)

    闭包函数也叫 匿名函数
    闭包函数( closures ) 允许创建一个没有指定名称的函数,最经常用作回调函数参数的值。

    闭包函数没有函数名称,直接在function()传入变量即可— 使用时 将定义的 变量 当作函数 来处理

    闭包的四大特点
    1、函数嵌套函数
    2,内部函数可以访问外部函数的变量
    3,参数和变量不会被回收
    4,函数作为参数 / 返回值的时候

    案例:(当函数执行完,占用内存,不会销毁)

    // addCount 函数作为返回值
    function addCount() {
        var count = 0;
        var addCount = function() {
            count++;
       }
        return addCount;
    }
    document.body.addEventListener("click", addCount);
    

    递归函数

    递归:函数自己调用自己
    在递归的过程中会出错:内存溢出,超出最大的堆栈大小
    递归要写一个结束的条件

    案例:求 1+2+3+4+...+n(递归方法)

    function  getSum(n){
      if ( n === 1){
         return 1
      }
       return n + getSum(n - 1)
    } 
    getSum(9)
    

    解析:
    当 n = 9时;那么该函数等于

    9 +  getSum(8)
    9 + 8 + getSum(7)
    9 + 8 + 7 + getSum(6)
    9 + 8 + 7 + 6 + getSum(5)
    9 + 8 + 7 + 6 + 5+ getSum(4)
    9 + 8 + 7 + 6 + 5 + 4 + getSum(3)
    9 + 8 + 7 + 6 + 5 + 4+ 3 + getSum(2)
    9 + 8 + 7 + 6 + 5 + 4 + 3 + 2 + getSum(1)
    9 + 8 + 7 + 6 + 5 + 4 + 3 + 2 + 1 = 45
    

    解答流程就是如此,等到 n = 1 时候,此函数才会结束,如果没有结束条件,他会一直执行下去,最终导致内存溢出,超出最大的堆栈大小

    浅拷贝 与 深拷贝

    1,定义
    浅拷贝:只能拷贝数据的第一层,第二次数据是展示原来堆栈内存中的值,并不是自己堆栈中数据;第二层中数据改变,是修改原来堆栈内存中的值
    深拷贝:把数据结构全部拷贝下来,所有数据都在自己堆栈内存中的数据,可以直接进行修改
    注:ES6中的三个点拷贝对象,是浅拷贝,并且 Object.assign()也是浅拷贝
    展示:

    git.gif
    最原始的值,修改之后,发现他直接修改了原来堆栈内存中的值

    2,常见的一些拷贝方法

    • 浅拷贝:

      • ES6:object.assign()
      • 展开运算符……
      • 封装函数实现for in
    • 深拷贝:

      • JSON方法
      • 递归(自己调用自己)方法 判断第一层属性的类型,用for…in实现遍历和复制,多层拷贝对象的属性
      • Object.created();

    案例

    // 配置数据
    var a = { name : “hello” };
    var obj1 = {
      name: 'zs',
      age: 18,
      dog: {
          name: '金毛',
          age: 2
       },
      friends: ['ww', 'lil']
    }
    var obj2 = {};
    
    浅拷贝
    // 1,Object.assign() -浅拷贝
    var b = Object.assign( { },a );  // { name : “hello” }
    
    // 2,展开运算符…… - 浅拷贝
    var b = {... a}
    
    // 3,封装函数实现for in
    function copy(obj){
        var result = { };
        for(var attr in obj ){
            result [attr] = obj[attr];
        }
        return result;
    }
    
    
    深拷贝
    * 封装函数实现for in
    // 1,JSON方法-深拷贝
    var obj2 =JSON.parse(JSON.stringify(obj1))//
    
    // 2,递归-深拷贝
    function deepCopy(o1, o2) {
       for (var k in o1) {
      //如果第一层中的属性是数组复杂类型
          if (o1[k] instanceof Array) {
              o2[k] =[];//如果o1[k]是数组,那就给o2[k]也准备一个数组存放拷贝过来的内容
              deepCopy(o1[k], o2[k]);
          }
       }
    }
    
    // 3,Object.create()具体使用方法
    var obj = {name:'lisi'};
    var newObj = Object.create(obj);  //newObj的原型(proto)指向obj,具备了obj的属性和方法
    

    相关文章

      网友评论

          本文标题:高级函数(闭包,递归,深浅拷贝)

          本文链接:https://www.haomeiwen.com/subject/upfgtktx.html