【Javascript系统学习】(二)

函数

定义函数

函数提升仅适用于函数声明,而不适用于函数表达式

函数声明

函数表达式

//例子1
const factorial = function fac(n) {return n < 2 ? 1 : n * fac(n - 1);
};console.log(factorial(3)); // 6
//factorial(n)、fac(n)、arguments.callee()
-------------------------------------------
//例子2 该函数接收由函数表达式定义的函数,并对作为第二个参数接收的数组的每个元素执行该函数:
function map(f, a) {const result = new Array(a.length);for (let i = 0; i < a.length; i++) {result[i] = f(a[i]);}return result;
}const cube = function (x) {return x * x * x;
};const numbers = [0, 1, 2, 5, 10];
console.log(map(cube, numbers)); // [0, 1, 8, 125, 1000]

递归

function foo(i) {if (i < 0) {return;}console.log(`开始:${i}`);foo(i - 1);console.log(`结束:${i}`);
}
foo(3);// 打印:
// 开始:3
// 开始:2
// 开始:1
// 开始:0
// 结束:0
// 结束:1
// 结束:2
// 结束:3

用于获取DOM树子节点

function walkTree(node) {if (node === null) {return;}// 对节点做些什么for (let i = 0; i < node.childNodes.length; i++) {walkTree(node.childNodes[i]);}
}

闭包

闭包在一个函数里面嵌套另外一个函数。嵌套(内部)函数对其容器(外部)函数是私有的闭包是可以拥有独立变量以及绑定了这些变量的环境(“封闭”了表达式)的表达式(通常是函数)。既然嵌套函数是一个闭包,就意味着一个嵌套函数可以“继承”容器函数的参数和变量。换句话说,内部函数包含外部函数的作用域

闭包是 JavaScript 中最强大的特性之一。JavaScript 允许函数嵌套,并且内部函数具有定义在外部函数中的所有变量和函数(以及外部函数能访问的所有变量和函数)的完全访问权限

外部函数却不能访问定义在内部函数中的变量和函数。这给内部函数的变量提供了一种封装。

此外,由于内部函数可以访问外部函数的作用域,因此当内部函数生存周期大于外部函数时外部函数中定义的变量和函数的生存周期将比内部函数执行的持续时间要长当内部函数以某一种方式被任何一个外部函数之外的任何作用域访问时,就会创建闭包

  • 内部函数只可以在外部函数中访问。
  • 内部函数形成了一个闭包:它可以访问外部函数的参数和变量,但是外部函数却不能使用它的参数和变量。
function addSquares(a, b) {function square(x) {return x * x;}return square(a) + square(b);
}console.log(addSquares(2, 3)); // 13
console.log(addSquares(3, 4)); // 25
console.log(addSquares(4, 5)); // 41
--------------------------------------
//由于内部函数形成了闭包,因此你可以调用外部函数并为外部函数和内部函数指定参数:
function outside(x) {function inside(y) {return x + y;}return inside;
}const fnInside = outside(3); // 可以这样想:给我一个可以将提供的值加上 3 的函数
console.log(fnInside(5)); // 8
console.log(outside(3)(5)); // 8

保存变量:上例中 inside 被返回时 x 是怎么被保留下来的。一个闭包必须保存它可见作用域中所有参数和变量。因为每一次调用传入的参数都可能不同,每一次对外部函数的调用实际上重新创建了一遍这个闭包。只有当返回的 inside 没有再被引用时,内存才会被释放。

 多层嵌套函数

  • 函数(A)可以包含函数(B),后者可以再包含函数(C)。
  • 这里的函数 B 和 C 都形成了闭包,所以 B 可以访问 AC 可以访问 B
  • 此外,因为 C 可以访问 B(而 B 可以访问 A),所以 C 也可以访问 A

闭包可以包含多个作用域;它们递归地包含了所有包含它的函数作用域。这个称之为作用域链

function A(x) {function B(y) {function C(z) {console.log(x + y + z);}C(3);}B(2);
}
A(1); // 打印 6(即 1 + 2 + 3)
------------------------------------
//实例2
function outside() {const x = 5;function inside(x) {return x * 2;}return inside;
}
console.log(outside()(10)); // 20(而不是 10)//这里的作用链域是 {inside、outside、全局对象}。因此 inside 的 x 优先于 outside 的 x

 

 

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

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

相关文章

Linux基础 (十三):计算机网络基础概论

一、网络基本概念 1.1 网络 把独立自主的计算机通过传输介质和网络设备链接起来&#xff0c;就构成一个网络 &#xff0c;网络是由若干结点和连接这些结点的链路组成&#xff0c;网络中的结点可以是计算机&#xff0c;交换机、 路由器等设备。 网络设备有&#xff1a;交换机、…

MySQL多表查询分类

1.连接查询 内连接:查询多张表的交集部分&#xff0c;只有在两个表中都有匹配的字段值时&#xff0c;记录才会返回。 以下是一个简单的MySQL内连接查询示例&#xff1a; 假设我们有两个表&#xff0c;一个是员工表 employees 和一个是部门表 departments。 employees 表: …

名字能化解命中的劫数,你可知道?

老师&#xff0c;是我们全社会都要尊重的职业&#xff0c;教书育人培养着优秀人才。然而&#xff0c;在她人生最脆弱的时候&#xff0c;学校却解除了与她的劳动关系&#xff0c;再次给她“致命一击”&#xff0c;她所遭受的不公待遇和供职学校的冷漠&#xff0c;引发了社会极大…

【Vue】——前端框架的基本使用

&#x1f4bb;博主现有专栏&#xff1a; C51单片机&#xff08;STC89C516&#xff09;&#xff0c;c语言&#xff0c;c&#xff0c;离散数学&#xff0c;算法设计与分析&#xff0c;数据结构&#xff0c;Python&#xff0c;Java基础&#xff0c;MySQL&#xff0c;linux&#xf…

『大模型笔记』Transformer的几种高效自注意力(降低计算复杂度的方法)!

Transformer的几种高效自注意力(降低计算复杂度的方法)! 文章目录 一. 快速回顾一下注意力机制二. 有哪些技术可以用来提高注意力的效率1. Sparse attention(1) 算法原理:Strided Attention & Fixed Attention(2) 复杂度分析: O ( N N p

关于ASPICE 4.0评估师资质更新的说明-亚远景科技

什么时候能查到ASPICE评估师4.0资质的更新&#xff1f; 从2024年7月1日起&#xff0c;您的官方认证记录中将会注明您所具备的Automotive SPICE版本&#xff08;3.1或4.0&#xff09;。这将适用于您在www.intacs.info上的评估师档案以及您的个人认证文件&#xff08;证书和评估…

黄仁勋:打破摩尔定律,机器人时代来了

6月2日&#xff0c;英伟达联合创始人兼首席执行官黄仁勋在Computex 2024&#xff08;2024台北国际电脑展&#xff09;上发表主题演讲&#xff0c;分享了人工智能时代如何助推全球新产业革命。 以下为本次演讲的要点&#xff1a; ①黄仁勋展示了最新量产版Blackwell芯片&#…

聊 · Flutter

曾经的团队是国内最早投入Flutter框架怀抱的团队&#xff0c;后来又有机会负责起了Flutter相关项目&#xff0c;翻回以前写的文章&#xff0c;感慨良多&#xff0c;这是其中的一篇关于这些内容的闲聊。 | 导语Flutter相关的技术资源官网和网友都有过系统且细致的整理&#xff0…

GIT安装以及详细操作流程

一、Git的安装 Git支持Linux、Windows和Mac系统&#xff0c;安装Git&#xff0c;可以到Git官方网站直接下载安装程序。 Git仓库的基本概念和流程 什么是版本库&#xff1f;版本库又名仓库&#xff0c;英文名repository,你可以简单的理解一个目录&#xff0c;这个目录里面的所…

银河麒麟安装miniconda

参考&#xff1a; https://blog.csdn.net/hknaruto/article/details/131677226 下载可用版本 https://repo.anaconda.com/miniconda/Miniconda3-py37_4.9.2-Linux-aarch64.sh安装 bash Miniconda3-py37_4.9.2-Linux-aarch64.sh创建文件 touch ~/active-conda.env编辑文件 …

SpringBoot历史版本信息

截至20230823&#xff0c;Spring Boot已经发布的版本 系统环境要求&#xff1a; Spring BootSpringJavaMavenGradleSpring Boot 3.1.x3.1.2Spring Framework 6.0.11Java 17~203.6.37.5以上,8.x3.1.1Spring Framework 6.0.10Java 17~203.6.37.5以上,8.x3.1.0Spring Framework …

[已解决] 使用vuepress-plugin-search-pro时编译出错Error: SlimSearch: duplicate ID

vuepress-plugin-search-pro 在处理 vuepress 的 .md 文件时&#xff0c;如果 frontmatter 部分内容重复可能会导致编译出错&#xff0c;如Error: SlimSearch: duplicate ID xx&#xff1a; 在本例中&#xff0c;是由于失误导致两个文件的 abbrlink 值一样&#xff0c;从而导…

flink实战--大状态任务调优指南-DataStream作业

Flink 状态(State)简介 在 Flink 中,状态管理是流处理应用的核心概念之一,它允许算子(operators)在处理事件时保持和操作状态信息。在 Flink 中,状态可以被视为算子的“记忆”,它使得算子能够在处理无界流数据时保持对历史数据的跟踪。状态可以是简单的键值对,也可以是…

element-plus表格添加简单右键

实现如下 <template><main class"mainClass" > <el-table :data"tableData" style"width: 100%"row-contextmenu"rowContextmenu"cell-contextmenu"cellContextmenu"contextmenu.prevent><el-table-c…

【Power Compiler手册】7.功耗分析

概述 `report_power` 命令分析并报告设计中各种元素的功耗。在执行此命令之前,必须捕获开关活动,将设计映射到门级,并标注设计。 该工具为以下设计元素创建功耗报告: - 设计 - 模块 - 网络 - 单元或特定类型的单元组 - 多角多模式设计的场景 `report_power` 命令使用…

【全开源】Shopro社区团购(小程序版)

邻里间的购物新选择 基于Fastadmin后端管理系统Uniapp客户端&#xff08;仅支持微信小程序&#xff09;开发&#xff0c;生鲜果蔬社区团购的不二之选、快速搭建社区团购平台、让你的产品走进上千个社区。线上团购线下自提&#xff0c;玩转社区消费新模式提供专业、优质的社区团…

Python面试宝典:Python中与设计模式相关的面试笔试题(1000加面试笔试题助你轻松捕获大厂Offer)

Python面试宝典:1000加python面试题助你轻松捕获大厂Offer【第二部分:Python高级特性:第二十二章:代码设计和设计模式:第二节:设计模式】 第二十二章:代码设计和设计模式第二节:设计模式创建型模式结构型模式行为型模式python中与设计模式相关的面试笔试题面试题1面试题…

openh264 编码命令行工具源码分析

openh264 OpenH264 是由 Cisco 公司发布的一个开源的 H.264 编码和解码器。它提供了命令行工具&#xff0c;可以用于对视频进行编码和解码操作。 使用说明 openh264 编码命令行工具可以使用命令行或 config 配置进行编码操作。编译和使用方法具体可以参考 Windows11编译open…

easyexcel将csv转为excel处理数字问题

使用easyexcel可以将csv格式的文件转为.xlsx文件&#xff0c;但是csv中有很多数字&#xff0c;比如&#xff1a;"123","12.34","-111"&#xff0c;默认情况下会将其作为字符串写入.xlsx文件&#xff0c;就如同下面一样&#xff0c;字符类型的数字…

web应用中的robots.txt配置

web应用中的robots.txt配置 配置/robots.txt 有什么用 在Web应用中&#xff0c;robots.txt 是一个非常重要的文件&#xff0c;它用于指导网络爬虫&#xff08;如搜索引擎的爬虫&#xff09;如何访问和索引网站的内容。这个文件位于网站的根目录&#xff08;即 http://www.exa…