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

2020-06-12  本文已影响0人  jasmine_6aa1

闭包函数(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,常见的一些拷贝方法

案例

// 配置数据
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的属性和方法
上一篇下一篇

猜你喜欢

热点阅读