• 06 js-递归


    含义:

    函数内部不断调用自身。递归函数的使用要注意函数终止条件避免死循环(一般都要写一个结束的条件);

        //在递归的过程中会出错
        // Maximum call stack size exceeded
        // 内存溢出:超过了最大的堆栈大小
    

    递归应用场景:

    • 深拷贝
    • 菜单树
    • 遍历 DOM 树

    示例

    • 深拷贝
        function deepCopy(o1, o2){
            for(var key in o1){
                var item = o1[key];
                if(item instanceof Object){
    		o2[key] = {}; 
    		deepCopy(item, o2[key])
                }else if(item instanceof Array){
    		o2[key] = {}; 
    		deepCopy(item, o2[key])
    	    }else{ //基本类型的拷贝
    		o2[key] = o1[key];
    	    }				
    	}
        }
        var obj1 = {
          name: 'zs',
          age: 18,
          dog:{
            name:'xx',
            age:2
          },
          friend:['lisi','ww']
        };
        var obj2 = {};
        deepCopy(obj1, obj2);
        obj1.name = 'name';
        obj1.dog = 'dogname';
        obj1.friend[0] = 'ls';
    
    

    • 菜单树
        var data = [{name:'分类1',children:[{name:'分类1-1',children:[{name:'分类1-1-1'}]},{name:'分类1-2'}]},{name:'分类2',children:[{name:'分类2-1'}]},{name:'分类3'}];
    
        var tree = document.getElementById('tree');
        createTree(tree, data)
    
        function createTree(element, data){
              var ul = document.createElement('ul');
              element.appendChild(ul);
              for(var i = 0; i < data.length; i++){
                    var li = document.createElement('li');
                    ul.appendChild(li);
                    li.innerText = data[i].name;
                    if(data[i].children.length > 0){
                          createTree(li, data[i].children)
                    }
              }
        }
    

    • 遍历DOM树
          //遍历li元素并添加点击事件
          function loadTree(parent, callback){
              for(var i = 0; i < parent.children.length; i++){
                var child = parent.children[i];
                if(callback){
    		callback(child);
                }
                loadTree(child);
              }
          }
    
          var ul = document.querySelector('ul');
          loadTree(ul, function(element){
              element.onclick = function(){
    	      console.log(this.innerText)
              }
          })
    
    
  • 相关阅读:
    接口方法上的注解无法被@Aspect声明的切面拦截的原因分析
    SpringBoot整合Netty
    简单的RPC框架
    基于redis的分布式锁的分析与实践
    8种方案解决重复提交问题
    领券中心项目,如何用 Redis 做实时订阅推送的?
    IM(即时通讯)服务端(二)
    IM(即时通讯)服务端(一)
    0xC00000FD: Stack overflow (parameters: 0x00000000, 0x003E2000).错误
    int (*a)[10]和int *a[10]的区别
  • 原文地址:https://www.cnblogs.com/vicky123/p/13408156.html
Copyright © 2020-2023  润新知