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

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

作者: 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的属性和方法

相关文章

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

    闭包函数(closures) 闭包函数也叫 匿名函数闭包函数( closures ) 允许创建一个没有指定名称的函...

  • 前端面试题【Day01】

    本篇绪论1,闭包2,深浅拷贝3,防抖、节流 1,闭包 闭包的定义很简单:函数 A 返回了一个函数 B,并且函数 B...

  • 函数表达式

    一、函数声明提升 二、递归 三、闭包(详见闭包)

  • Kotlin (二)

    尾递归 高级函数中的block 高阶函数之迭代 函数引用 闭包 1、函数的运行时环境:2、持有函数的运行状态;3、...

  • js 学习笔记

    闭包:闭包是指有权访问另一函数作用域中变量的函数。 深拷贝与浅拷贝https://www.cnblogs.com/...

  • python高级

    python高级:1、模块和包2、深浅拷贝3、回顾面向对象4、列表生成器5、迭代器6、装饰器7、函数高级8、正则表...

  • 前端进击的巨人(二):栈、堆、队列、内存空间

    面试经常遇到的深浅拷贝,事件轮询,函数调用栈,闭包等容易出错的题目,究其原因,都是跟JavaScript基础知识不...

  • js闭包 与事件队列

    针对闭包相信小伙伴们有很多不同的概念跟理解 何为闭包,从结构上来讲,闭包就是函数套函数,类似递归这种函数调用函数本...

  • 闭包理解(个人笔记)

    闭包 闭包 是指有权访问另一个函数作用域中的变量的函数(JavaScript高级程序设计)闭包:函数A内部有函数B...

  • GO基础7-函数详解

    自定义类型 将函数作为另一函数的参数 函数作为返回值 匿名自执行函数接收参数 函数递归:自己调用自己 闭包 闭包可...

网友评论

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

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