js——高阶函数、闭包、递归以及浅拷贝和深拷贝

news2024/11/30 2:32:10

目录

一、高阶函数

1、什么是高阶函数

2、把一个函数作为参数

3、return 返回的也是一个函数

二、闭包

1、闭包是什么

2、变量的作用域

3、案例

4、结果展示:

 5、总结:

三、递归

1、什么是递归

2、案例一

3、分析

4、问题

5、栈溢出又是什么呢

6、解决方法

7、案例二

8、分析

9、结果展示:

10、总结


一、高阶函数

1、什么是高阶函数

高阶函数是那些操作其他函数的函数。用最简单的话来说,高阶函数就是一个将函数作为参数或者返回值函数。就是满足以下两种函数都可以称为高阶函数

(1)把一个函数作为参数

(2)return 返回的也是一个函数

2、把一个函数作为参数

举例说明:

<script>
        function fn(a,b,callback){
            console.log(a+b);
            callback && callback() 
//如果第一值callback不存在(false),直接返回false,如果第一个值存在,则运行第二个值 callback()
        }
        fn(1,2,function(){
            console.log('我是最后调用的');
        })
    </script>

上面的例子意思就是,我定义了一个函数fn,里面有三个参数,a,b以及一个函数callback,然后输出a+b,然后我再执行callback函数,他会先执行a+b,然后再执行callback函数

结果截图:

3、return 返回的也是一个函数

举例说明:

<script>
        function fn(){
            return function(){}
        }
        fn();
</script>

 

这里return 返回的是一个函数,那他就是高阶函数

总结:高阶函数是对其他函数进行操作的函数,他接受函数作为参数或将函数作为返回值输出

二、闭包

1、闭包是什么

闭包指有权访问另一个函数作用域中变量的函数

简单理解就是,一个作用域可以访问到另外一个函数内部的局部变量

2、变量的作用域

我们先复习一下关于变量的作用域的知识,来帮我们更好的理解闭包

 变量的作用域

        变量的作用域的不同分为两种:全局变量局部变量

        1、函数内部可以使用全局变量

        2、函数外部不可以使用局部变量

        3、当函数执行完毕,本作用域内的局部变量会销毁

3、案例

script>
        function fn(){
            num =8
            function fun(){
                console.log(num);
            }
            fun()
        }
        fn()
    </script>

分析:首先我们定义了一个函数名叫fn的函数,我们在里面定义了一个num = 8 ,然后我们又在fn的函数中又定义了一个名叫fun的函数,然后我们在fun这个函数里面打印了num的值

4、结果展示:

 5、总结:

我们成功在fun函数中调用了fn函数中的变量num,也就是我们闭包说的在访问另一个函数作用域中变量的函数,这就是闭包。

三、递归

1、什么是递归

 如果一个函数在内部可以调用其本身,那么这个函数就是递归函数

简单理解:函数内部自己调用自己,这个函数就是递归函数

2、案例一

function fn(){
    fn()
  }
 fn()

3、分析

我们使用函数声明:用 function 关键字声明一个函数,再执行一个函数名fn,这种声明函数的方式我们是需要在函数外面调用函数的,但我不仅仅在函数外面调用,我在函数里面也调用了函数,是调用自己的函数。这就是一个最简单的案例

4、问题

像我们上面这样使用递归很容易发生“栈溢出”错误(stack overflow),结果如下图,原因是因为什么呢,举个例子,我们的递归其实跟我们的for循环很像,他会一直调用自己,但是如果这个函数里面还存在了一些变量或者数据的话,那他就会去内存开辟空间来保存这些数据,那么问题就来了,他一直在调用,就会一直开辟空间,那么就会导致“噶了”

5、栈溢出又是什么呢

每次执行JavaScript代码时,都会分配一定尺寸的栈空间(Windows系统中为1M),每次方法调用时都会在栈里储存一定信息(如参数、局部变量、返回值等等),这些信息再少也会占用一定空间,如果存在较多的此类空间,就会超过线程的栈空间了。
说白了就是就是不顾堆栈中分配的局部数据块大小,向该数据块写入了过多的数据,导致数据越界,结果覆盖了别的数据。

6、解决方法

就是当我们的代码的结果达到了我们所需要的效果就给他结束掉,也就是加一个return 

7、案例二

<script>
        var num = 1
        function fn(){
            console.log('枕头睡不醒');
            if(num == 10){
                return
            }
            num++
            fn()
        }
        fn()
    </script>

8、分析

我们首先定义了一个num=1,我们又定义了一个函数交fn,最外层绝对是要调用fn函数的,不然就没法运行了,我们又在里面再次调用了fn函数,在fn函数中我们想要打印‘枕头睡不醒’,重点来了,我们这里有一个判断条件,当这个num 的次数=10 的时候,我们就终止函数return掉,然后num++,也就是每次执行完之后num值+1。这样就不会发生栈溢出的问题了

9、结果展示:

10、总结

递归就是如果一个函数在内部可以调用其本身,那么这个函数就是递归函数,记住使用递归的时候一定要加return哦!防止出现‘栈溢出’的问题

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/41337.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Unity Shader​】 屏幕后处理5.0:讨论双重模糊的Bloom

接上一篇基于高斯模糊的Bloom继续进行接下来的学习。 1 一些必要的思考* 1.1 关于高质量Bloom 前面提到了&#xff0c;Bloom对于游戏必不可少的效果之一&#xff0c;于是我们不仅仅要把Bloom效果实现出来&#xff0c;效果的质量好坏就更加是我们需要关注的点了。高质量泛光&a…

面试宝典之C++多态灵魂拷问

&#x1f9f8;&#x1f9f8;&#x1f9f8;各位大佬大家好&#xff0c;我是猪皮兄弟&#x1f9f8;&#x1f9f8;&#x1f9f8; 文章目录一、重载&#xff0c;隐藏/重定义&#xff0c;覆盖/重写二、多态的原理三、inline可以是虚函数吗四、静态成员函数可以是虚函数吗五、构造函…

海丝一号-中国-2020

2020年12月22日&#xff0c;由中国电科38所和天仪研究院联合研制的我国首颗商业SAR卫星“海丝一号”搭载长征八号运载火箭在文昌卫星发射中心成功发射。海丝一号历时一年完成研制&#xff0c;整星重量小于185kg&#xff0c;成像最高分辨率1m&#xff0c;可以全天时、全天候对陆…

章节5 文件与目录管理

5-Linux文件和目录管理 &#xff08;Linux操作系统-2022的前面章节都为铺垫&#xff09; 常见命令格式 Command Options Arguments 命令 选项 参数 rm -rf /* -一个字母或字母组合&#xff0c;此选项为短选项&#xff0c;–单词&#xff0c;此选项为长选项 Options选项&…

因果推断 | 双重差分法笔记补充

换了新的环境后&#xff0c;一直在适应&#xff08;其实是一直被推着走&#xff09;&#xff0c;所以停更了笔记好久啦。这一周周末终于有点得空&#xff0c;当然也是因为疫情&#xff0c;哪里都不能去&#xff0c;哈哈&#xff0c;所以来冒个泡~ 整理了最近pre的作业&#xf…

ESP32-CAM初始篇:Arduino环境搭建-->实现局域网推流

ESP32-CAM初始篇&#xff1a;Arduino环境搭建–>实现局域网推流 入手产品&#xff1a;安信可科技&#xff1a;ESP32-CAM摄像头开发板&#xff1a; 相关产品特性请访问安信可ESP32-CAM官网&#xff1a;https://docs.ai-thinker.com/esp32-cam 第一步&#xff1a;下载Ardui…

基于51单片机数字频率计的设计

目录 前 言 1 第一章 总体设计方案 2 1.1 总设计框图 2 1.2 硬件设计分析 2 1.2.1 电源的设计 2 &#xff08;4&#xff09;&#xff1a;LCD1602的指令说明及时序 10 &#xff08;5&#xff09;&#xff1a; LCD1602的RAM地址映射及标准字库表 13 第二章 软件设计与分析 15 2.1…

谷粒商城十一商城系统及整合thymeleaf渲染商城首页

我们的商城系统本应该也是前后端分离的&#xff0c;就像后台管理系统那样&#xff0c;然而出于教学考虑&#xff0c;前后端分离的话就会屏蔽掉很多细节&#xff0c;所以我们进行服务端的页面渲染式开发&#xff08;有点儿类似freemarker&#xff09; 这些页面直接粘贴到微服务…

含论文基于JSP的零食销售商城【数据库设计、源码、开题报告】

数据库脚本下载地址&#xff1a; https://download.csdn.net/download/itrjxxs_com/86500759 主要使用技术 ServletJSPcssjsMysqlTomcat 功能介绍 (1)前台功能模块&#xff1a; 注册登陆&#xff1a;顾客可以通过填写注册信息成为会员&#xff0c;登陆后才能进行购物车的管…

汽车 Automotive > SOME/IP应用学习

目录 SOME/IP介绍 SOME/IP主要功能 SOME/IP协议 SOME/IP服务类型 SOME/IP-举例 SOME/IP各模块协议 SOME/IP-基础元件 SOME/IP-SoAD SOME/IP-SD协议 SOME/IP-SD举例 SOME/IP-TP协议 SOME/IP-TP举例 SOME/IP介绍 SOME/IP ( Scalable service-Oriented Middleware ove…

基于Android的JavaEE课设

目录 1 技术栈 2 android前端 2.1 概述 2.1.1 目录结构 2.1.2 代码分层 2.2 技术点 2.2.1 数据绑定 2.2.2 前后端数据交互 2.2.3 九宫格图片 2.2.4 未处理消息提醒 2.2.5 动画效果 2.2.6 实时聊天 2.2.7 文件上传 2.2.8 底部弹窗 2.2.9 其他 3 后端 3.1 概述 …

BUUCTF Misc 假如给我三天光明 数据包中的线索 后门查杀 webshell后门

假如给我三天光明 下载文件&#xff0c;一个压缩包&#xff08;需要密码&#xff09;和图片 百度得知下面一行是盲文&#xff0c;根据盲文对照表 和上述图片对照&#xff0c;得到字符串&#xff1a;kmdonowg 。使用它解压压缩包 使用Audacity打开 转换成摩斯密码&#xff0c;…

C语言程序设计 复习总结[持续更新ing]

目录 一 初识C语言 1 main 主函数 2 注释 3 C 程序执行的过程&#xff1a; 4 C 程序的结构 5 进制的转换 1.内存容量 2.二进制与十进制的转换 1>将二进制数转换成十进制 2>将十进制转换成二进制数 3.二进制与八进制的转换 1>将八进制数转换成二进制: 2>将二进…

Java项目:JSP酒店客房管理系统

作者主页&#xff1a;源码空间站2022 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 项目介绍 酒店管理系统共分为三个角色&#xff0c;客房经理、前台管理员、客户&#xff0c;各个角色的权限各不相同&#xff1b; 客房经理功能包括&#…

leetcode《图解数据结构》刷题日志【第五周】(2022/11/21-2022/11/28)

leetcode《图解数据结构》刷题日志【第五周】1. 剑指 Offer 60. n 个骰子的点数1.1 题目1.2 解题思路1.3 数据类型功能函数总结1.4 java代码1.5 踩坑小记1.6 进阶做法2. 剑指 Offer 63. 股票的最大利润2.1 题目2.2 解题思路2.3 数据类型功能函数总结2.4 java代码3. 剑指 Offer …

SpringBoot SpringBoot 原理篇 1 自动配置 1.16 自动配置原理【2】

SpringBoot 【黑马程序员SpringBoot2全套视频教程&#xff0c;springboot零基础到项目实战&#xff08;spring boot2完整版&#xff09;】 SpringBoot 原理篇 文章目录SpringBootSpringBoot 原理篇1 自动配置1.16 自动配置原理【2】1.16.1 看源码了1.16.2 Import({AutoConfig…

archlinux 安装matlab

最近在学matlab使用的是windows版本的&#xff0c;比起windows我更喜欢在linux中写代码。于是乎就想在Linux中安装一下。 主要过程参考此篇文章&#xff1a; 《【首发】 ubuntu20.04安装matlab2021b/matlab2020b》 https://blog.csdn.net/hanjuefu5827/article/details/1151677…

【Hack The Box】Linux练习-- Forge

HTB 学习笔记 【Hack The Box】Linux练习-- Forge &#x1f525;系列专栏&#xff1a;Hack The Box &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; &#x1f4c6;首发时间&#xff1a;&#x1f334;2022年11月27日&#x1f334; &#x1f36…

队列(C语言实现)

文章目录&#xff1a;1.队列的概念2.队列的结构3.接口实现3.1初始化队列3.2判断队列是否为空3.3入队3.4出队3.5查看队头元素3.6查看队尾元素3.7统计队列数据个数3.8销毁队列1.队列的概念 队列&#xff1a;只允许在一端进行插入数据操作&#xff0c;在另一端进行删除数据操作的特…

jQuery插件【validate】国际化校验插件

jQuery插件系列 相信大家在网站上都遇到过这种注册的情况吧&#xff0c;有的时候我们什么也不输入点登录或者注册或者鼠标失去焦点的时候&#xff0c;就会自动提示xxx为空&#xff0c;密码不正确&#xff0c;请输入xxx等一系列的提示信息。 那么这是怎么实现的呢&#xff0c;其…