JavaScript 进阶A(作用域、闭包、变量和函数提升、函数相关只是、数组解构、对象解构、构造函数
1.作用域
作用域主要分为:局部作用域和全局作用域。
局部作用域又分为:函数作用域和块作用域
- 函数作用域:在函数中定义的变量只能在函数内部使用,外部无法访问
- 块作用域:被大括号{}包起来的代码块,在这个代码块中定义的变量就生存在块作用域内
全局作用域:全局作用域可以被其他作用域访问
作用域链
作用域链就是变量查找的机制,在函数被调用的时候,会优先查找函数作用域内的变量。如果找不到再去依次向外层父作用域查找。
如果被调函数作用域内有与外部变量同名变量,优先调用函数作用域内部变量
作用域之间的关系:子作用域可以访问父作用域,父作用域不可访问子作用域
2.闭包
我们来看一个简单的闭包实例
function outter(){let a =0function inner(){a++console.log(a)}return inner
}let key = outter()
//实际上就是 key = inner 因为outter()最后的返回值是innerkey()
//调用一次就执行一次inner()函数
这是一个简单的计数器的例子,当我们使用key接收inner的值的时候。其实就是执行了一边outter函数然后把函数的返回值赋给key。此时的key()就是执行inner函数。
按理来说变量a会随着outter函数的结束而销毁。但是实际情况却并不是,我们通过key依旧可以访问这个变量。这里就要讲一下js的垃圾回收机制了。
js的垃圾回收机制是根据变量是否被引用而决定是否销毁它。因为在inner函数中我们通过console.log引用了外部的变量a。这就导致了内部的函数引用了外部的变量。虽然外部函数结束了,但是由于这个变量依旧被引用,所以变量得以保存
详细的过程:
1.当outter函数被执行的时候,会创建一个局部变量a
2.当inner函数被定义的时候会捕获其所在的词法环境
3.outter函数执行结束,正常情况是a被销毁,但是由于inner函数的引用,让a得以保存
4.当inner函数执行的时候仍然可以访问a,因为闭包保留了a
至于为什么不直接使用变量去实现计数器的效果,是因为闭包会把一个变量变为私有变量。正常的访问是无法访问这个变量的。只有我们通过inner函数调用的时候才会访问这个变量。这在一定程度上提升了安全性。
3.变量和函数提升
变量提升
变量的声明有三种方式:1.let 2.const 3.var
前两种我们经常会用到,但是第三种我们在之前都没怎么用过。
其实let和var本质上都是差不多的,唯一的区别在一var会存在“变量提升”
变量提升就是允许变量在声明之前被访问
我们来看两个案例:
案例1console.log(num)let num =10案例2console.log(num)var num =10结果:案例一报错。案例二打印undefined
通过这个我们可以很明确的发现,使用var声明的变量可以在声明语句前被访问,但是访问的结果是undefined,变量在未赋值之前访问结果是undefined。这也就说明了:变量提升只会提升变量的定义,不会提升赋值。
案例2的代码就相当于:
let a
console.log(a)
a=10
我们应该避免使用var
函数提升
函数提升和变量提升基本上一样,函数提升就是把当前作用域的函数声明提升到最前面。
我们在之前的代码中可能都会把函数声明来写到后面。
按照之前的思路来说,应该是先声明在使用。但是函数自己的定义就会有提升的效果。也就是说函数默认有函数提升。
我们之后在编写代码的时候如果有函数需要单独的写出来,我们建议写在最前面。
4.函数相关(参数、箭头函数
函数参数
动态参数
我们在编写代码的时候一般都会提前写好有几个参数,但是有的时候我们并不能确定我这个函数需要几个参数。这个时候再编写函数的代码的时候就会非常困难。
但是我们有一种方法可以解决这个问题:函数内置的arguments伪数组。
function fn(){console.log(arguments.length)console.log(arguments[0], arguments[1], arguments[2])console.log(typeof arguments[0], typeof arguments[1], typeof arguments[2])}fn(1,1.1,"Www")
看这段代码,我的函数在定义的时候是没有声明形参的,但是我调用的时候却传入了三个实参。
然后我通过arguments这个函数内置的伪数组得到了这三个参数。
arguments是函数内置的伪数组,它可以存储调用函数的时候传入的参数。即使函数定义了形参我依旧可以通过arguments获取这个形参
剩余参数
剩余参数:我们在传参的时候一般都是一一对应的传参,如果传递的实参数量大于形参,剩余的没有对应的参数就是剩余参数。我们可以把这些剩余参数表示为一个真数组
下面看案例来理解:
function fn(num,...arr){console.log(num);console.log(arr);}fn(1,2,3,4,5,7)
最后输出num是1,arr是一个数组,数组包含2,3,4,5,7
这个arr就是一个剩余参数构成的数组,一般来说我们都会把剩余参数写在参数列表的后面。
展开运算符:...数组 -》可以把数组的所有元素拿出来
假设有一个数组arr=[1,2,3,4,5,6,7] 则 ...arr = 1,2,3,4,5,6,7(不是字符串
箭头函数
箭头函数基本形式
(参数)=>{函数体}
1.如果参数只有一个 :可以省略参数的小括号: 参数=>{函数体}
2.如果函数体只有一条语句:可以省略大括号: (参数)=>语句 并且这个语句的结果就是返回值
箭头函数的this --- 继承父级的this
一个对象里面的方法(普通函数)的this指向这个对象,因为是对象调用了这个方法
一个对象里面的方法(箭头函数)的this指向window,因为箭头函数的this继承了对象的this
数组解构
作用:快速批量赋值
用法1.
arr = [1,2,3,4,5,6,7]
const [a,b,c,d,e,f,g] = arr 或者 const [a,b,c,d,e,f,g] = [1,2,3,4,5,6,7]
用法2.
有两个变量,想交换它们的值:[a,b] = [b,a]
注:const [a,b,c] = [1,2]这种情况下c是undefined
const [a,b] = [1,2,3]这种情况下会舍去多余的
可以使用剩余参数防止丢失:const[a,b,...c] = [1,2,3,4,5,6,7,8,9] 这种情况a1,b2,c是数组
对象解构
对象解构的作用和数组结构一样
我们先来回顾以下对象
对象名={对象内容},对象内容可以是变量或者函数,变量称为属性,函数称为方法。中间使用逗号隔开
obj ={name:"www",age:11,outer:function(){console.log(this.name,this.age) }
}const {name,age,outer} = objconsole.log(name,age)
outer()
具体使用没什么区别,然后要注意的是数组使用[]对象使用{}
方法结构出来可以调用它。但是outer是不能输出我们想要的内容的,主要是解构出来之后调用者从obj变成了window。
变量的名字要和属性名一致
如果想让变量不和属性一个名字可以使用const{name:aaa}这种方式让name变成aaa
构造函数
我们首先讲一下new关键字,这个关键字用于创建一个空对象
这个空的对象里面什么都没有,我们有两个方法为这个对象添加属性或者方法
1.new 构造函数()
2.new一个对象,通过对象.属性/方法添加
这是通过构造函数:
构造函数的作用就是创建和初始化对象。他需要使用new关键字调用
下面是一个简单的构造函数:
function student(stu_name,stu_age,stu_gender,stu_add){this.name=stu_name;this.age=stu_age;this.gender=stu_gender;this.add=stu_add;}const stu1= new student("xxx",11,"nan","001100")console.log(stu1)
我们首先声明了一个构造函数,这个函数接收四个参数
通常来说,这个函数里面的this指的是window。但是通过new关键字调用构造函数会把new关键字创建的新对象绑定到构造函数的this。
我们只需要记住通过new关键字调用构造函数,构造函数的this指向new创建的对象
其实我们在构造函数里面打印一下this就能知道this指向的是谁了。上面的例子里打印this会打印出student
这是通过手动添加:
我们需要先创建一个空的对象:const obj = new Object()
然后obj.属性/方法 添加属性或者方法
相关文章:
JavaScript 进阶A(作用域、闭包、变量和函数提升、函数相关只是、数组解构、对象解构、构造函数
1.作用域 作用域主要分为:局部作用域和全局作用域。 局部作用域又分为:函数作用域和块作用域 函数作用域:在函数中定义的变量只能在函数内部使用,外部无法访问块作用域:被大括号{}包起来的代码块,在这个…...
《深度剖析:特征工程—机器学习的隐秘基石》
在机器学习的宏大版图中,特征工程宛如一座隐藏在幕后却又至关重要的基石。它默默发挥着作用,将原始数据雕琢成模型能够有效学习和理解的形态,深刻影响着机器学习模型的性能与表现。 特征工程:机器学习的关键前奏 特征工程是运用…...
Python Tornado 框架面试题及参考答案
目录 Tornado 框架的核心组件是什么?解释其作用。 Tornado 与其他 Python 框架(如 Django、Flask)的主要区别是什么? 为什么 Tornado 适合高并发场景?其设计哲学是什么? 解释 Tornado 的 Application 类和 RequestHandler 类的关系。 如何在 Tornado 中配置静态文件路…...
【音视频】VLC播放器
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 一、vlc是什么? VLC Media Player(简称VLC)是一款免费、开源、跨平台的多媒体播放器,由非营利组织VideoLAN开发,最…...
视觉图像坐标转换
1. 透镜成像 相机的镜头系统将三维场景中的光线聚焦到一个平面(即传感器)。这个过程可以用小孔成像模型来近似描述,尽管实际相机使用复杂的透镜系统来减少畸变和提高成像质量。 小孔成像模型: 假设有一个理想的小孔,…...
算法刷题-2025年03月01日
import java.util.ArrayList; import java.util.Arrays; import java.util.List;public class test_02_28 {//长度最小的子数组 找出总和大于等于target的长度最小的子数组//target 7, nums [2,3,1,2,4,3] [1.2.2.3.3.4]public static int test1(int[] nums, int target){//存…...
算法1-2 分数线划定
题目描述 世博会志愿者的选拔工作正在 A 市如火如荼的进行。为了选拔最合适的人才,A 市对所有报名的选手进行了笔试,笔试分数达到面试分数线的选手方可进入面试。面试分数线根据计划录取人数的 150% 划定,即如果计划录取 m 名志愿者…...
设计模式之责任链模式
引言 在职场中,请假流程大家都再熟悉不过:申请 1 至 2 天的假期,只需直属主管审批即可;若要请假 3 至 5 天,就需部门负责人进行复核;而超过 5 天的假期申请,则必须由总经理最终定夺。要是遇到超…...
AndroidStudio下载旧版本方法
首先,打开Android Studio的官网:https://developer.android.com/studio。 然后,点击【Read release notes】。 然后需要将语言切换成英文,否则会刷不出来。 然后就可以看下各个历史版本了。 直接点链接好像也行:h…...
Excel基础(详细篇):总结易忽视的知识点,有用的细节操作
目录 基础篇Excel主要功能必会快捷键LotusExcel的文件类型工作表基本操作表项操作选中与缩放边框线 自动添加边框线格式刷设置斜线表头双/多斜线表头不变形的:双/多斜线表头插入多行、多列单元格/行列的移动冻结窗口 方便查看数据打印的常见问题Excel格式数字格式日期格式文本…...
FPGA开发,使用Deepseek V3还是R1(7):以“FPGA的整体设计框架”为例
以下都是Deepseek生成的答案 FPGA开发,使用Deepseek V3还是R1(1):应用场景 FPGA开发,使用Deepseek V3还是R1(2):V3和R1的区别 FPGA开发,使用Deepseek V3还是R1&#x…...
Android15 Camera HAL Android.bp中引用Android.mk编译的libB.so
背景描述 Android15 Camera HAL使用Android.bp脚本来构建系统。假设Camera HAL中引用了另外一个HAL实现的so (例如VPU HAL), 恰巧被引用的这个VPU HAL so是用Android.mk构建的,那Camera HAL Android.bp在直接引用这个Android.mk编…...
服务流程设计和服务或端口重定向及其websocket等应用示例
服务流程设计和服务或端口重定向及其websocket等应用示例 目录 服务或端口重定向的服务设计和websocket等应用示例 一、通用请求控制流程 1.1、入口 1.2、所有GET请求首先预检控制单元 1.3、http请求会分别自动307重定向 1.4、所有请求首先执行跨源控制单元 1.5、然后…...
(十 五)趣学设计模式 之 命令模式!
目录 一、 啥是命令模式?二、 为什么要用命令模式?三、 策略模式的实现方式四、 命令模式的优缺点五、 命令模式的应用场景六、 总结 🌟我的其他文章也讲解的比较有趣😁,如果喜欢博主的讲解方式,可以多多支…...
计算机毕设JAVA——某高校宿舍管理系统(基于SpringBoot+Vue前后端分离的项目)
文章目录 概要项目演示图片系统架构技术运行环境系统功能简介 概要 网络上许多计算机毕设项目开发前端界面设计复杂、不美观,而且功能结构十分单一,存在很多雷同的项目:不同的项目基本上就是套用固定模板,换个颜色、改个文字&…...
点云配准技术的演进与前沿探索:从传统算法到深度学习融合(3)
3、基于深度学习的点云配准方法 3.1 深度学习在点云配准中的应用原理 深度学习作为一种强大的机器学习技术,近年来在点云配准领域展现出了巨大的潜力和优势。其核心在于通过构建复杂的神经网络模型,能够自动从大量的点云数据中学习到高度抽象且有效的特…...
MyBatis TypeHandler 详解与实战:FastJson 实现字符串转 List
在 MyBatis 中,TypeHandler 是实现 Java 类型与数据库类型双向转换 的核心组件。无论是处理基础数据类型还是复杂的 JSON、枚举或自定义对象,它都能通过灵活的扩展机制满足开发需求。本文将通过一个 将数据库 JSON 字符串转换为 List<User> 的案例…...
实验环境搭建集锦(docker linux ros2+强化学习环境+linux上单片机串口调试)
为了记住一些实验环境配置开的文章,边配置边记,免得之后忘了。 Docker环境搭建 yay -S docker //下载docker docker info //查看docker配置 sudo systemctl start docker //系统配置打开docker sudo systemctl enable docker //系统配置后台开启d…...
第十三届蓝桥杯大赛软件赛决赛C/C++ 大学 B 组
A 【2022——暴力DP / 优雅背包】-CSDN博客 B 【钟表——类日期问题】-CSDN博客 C 【卡牌——二分】-CSDN博客 D 【最大数字——DFS】-CSDN博客 E 【出差——Dijkstra】-CSDN博客 F 【费用报销——01背包】-CSDN博客 G 【故障——条件概率】-CSDN博客 H 【机房—…...
商城系统单商户开源版源码
环境配置 1.软件安装 宝塔安装系统软件:Nginx、MySQL5.6、PHP( PHP用7.1-7.4版本)、phpMyAdmin(Web端MySQL管理工具)。 2.配置mysql 设置mysql,在已安装的软件里面找到 mysql点击进行设置 3.修改sql-mode 选择左侧配置修改,找到里面的sql-mode&…...
【SpringBoot+Vue】博客项目开发二:用户登录注册模块
后端用户模块开发 制定参数交互约束 当前,我们使用MybatisX工具快速生成的代码中,包含了一个实体类,这个类中包含我们数据表中的所有字段。 但因为有些字段,是不应该返回到前端的,比如用户密码,或者前端传…...
HTTP 协议的发展历程:从 HTTP/1.0 到 HTTP/2.0
HTTP 协议的发展历程:从 HTTP/1.0 到 HTTP/2.0 HTTP(HyperText Transfer Protocol,超文本传输协议)是 Web 的基础协议,用于客户端和服务器之间的通信。从 HTTP/1.0 到 HTTP/2.0,HTTP 协议经历了多次重大改…...
每日十个计算机专有名词 (7)
Metasploit 词源:Meta(超越,超出) exploit(漏洞利用) Metasploit 是一个安全测试框架,用来帮助安全专家(也叫渗透测试人员)发现和利用计算机系统中的漏洞。你可以把它想…...
SQL经典题型
查询不在表里的数据,一张学生表,一张学生的选课表,要求查出没有选课的学生? select students.student_name from students left join course_selection on students.student_idcourse_selection.student_id where course_selecti…...
基于Linux系统的物联网智能终端
背景 产品研发和项目研发有什么区别?一个令人发指的问题,刚开始工作时项目开发居多,认为项目开发和产品开发区别不大,待后来随着自身能力的提升,逐步感到要开发一个好产品还是比较难的,我认为项目开发的目的…...
文字描边实现内黄外绿效果
网页使用 <!DOCTYPE html> <html> <head> <style> .text-effect {color: #ffd700; /* 黄色文字 */-webkit-text-stroke: 2px #008000; /* 绿色描边(兼容Webkit内核) */text-stroke: 2px #008000; /* 标准语法 *…...
next实现原理
Next.js 是一个基于 React 的 服务器端渲染(SSR) 和 静态生成(SSG) 框架,它的实现原理涉及多个关键技术点,包括 服务端渲染(SSR)、静态生成(SSG)、客户端渲染…...
什么是 jQuery
一、jQuery 基础入门 (一)什么是 jQuery jQuery 本质上是一个快速、小巧且功能丰富的 JavaScript 库。它将 JavaScript 中常用的功能代码进行了封装,为开发者提供了一套简洁、高效的 API,涵盖了 HTML 文档遍历与操作、事件处理、…...
014 rocketmq角色介绍
文章目录 NameServer1 服务发现机制2 为什么要使⽤NameServer3 NameServer如何保证数据的最终⼀致?4 特点 BrokerProducerConsumerTopicQueueProducer GroupConsumer GroupMessageTagOffset 同一消费者组下,队列只能由一个消费者消费 广播模式࿱…...
如何防止Python网络爬虫爬取网站内容
要防止Python网络爬虫爬取网站内容,可以从以下几个方面入手: 遵守Robots.txt文件:首先,网站管理员可以通过robots.txt文件明确告知爬虫哪些页面可以抓取,哪些不可以。爬虫在抓取之前应先检查该文件,尊重网站…...
项目准备(flask+pyhon+MachineLearning)- 3
目录 1.商品信息 2. 商品销售预测 2.1 机器学习 2.2 预测功能 3. 模型评估 1.商品信息 app.route(/products) def products():"""商品分析页面"""data load_data()# 计算当前期间和上期间current_period data[data[成交时间] > data[成…...
选开源CMS建站系统时,插件越多越好吗?
在选择开源CMS建站系统时,插件数量并不是唯一的衡量标准,更不能简单地说“插件越多就越好”,还是需要综合评估来考虑选择结果,以下是有关选择开源CMS系统时对插件数量的考量。 插件数量的优势插件数量可能带来的问题功能丰富性&a…...
OSPF BIT 类型说明
注:本文为 “OSPF BIT 类型 | LSA 类型 ” 相关文章合辑。 机翻,未校。 15 OSPF BIT Types Explained 15 种 OSPF BIT 类型说明 Rashmi Bhardwaj Distribution of routing information within a single autonomous system in larger networks is per…...
C语言(3)—循环、数组、函数的详解
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、函数二、循环与数组 1.循环2.数组 总结 前言 提示:以下是本篇文章正文内容,下面案例可供参考 一、函数 在C语言中,函数…...
大唐杯——阶段二01
03 5G寻呼 UE(User Equipment) UE是用户设备(User Equipment)的缩写,指的是移动通信网络中的终端设备,例如手机、平板电脑、物联网传感器等。 AMF(Access and Mobility Management Function&a…...
清华大学Deepseek第六版AIGC发展研究3.0(共186页,附PDF下载)
人工智能生成内容(AIGC)正以前所未有的速度改变我们的生活。 2024年底,清华大学新闻与传播学院与人工智能学院联合发布了《AIGC发展研究3.0版》,这份报告系统梳理了AIGC技术的突破性进展、应用场景及社会影响,并展望了…...
【漫话机器学习系列】114.逻辑 Sigmoid 函数
逻辑 Sigmoid 函数详解 1. 引言 逻辑回归(Logistic Regression)是机器学习中常用的分类算法,而 Sigmoid 函数 是逻辑回归的核心数学工具。Sigmoid 函数能够将任意实数映射到 (0,1) 之间,因此特别适用于概率估计。在这篇文章中&a…...
Cocos Creator3.8.6拖拽物体的几种方式
文章目录 前言一、第一种通过UILocation二、第二种通过UIDelta实现总结 前言 在游戏开发中,拖拽物体是一个非常常见的交互功能,无论是用于UI元素的拖动,还是场景中物体的移动,拖拽操作都能极大地提升用户体验。Cocos Creator 3.8…...
01_NLP基础之文本处理的基本方法
自然语言处理入门 自然语言处理(Natural Language Processing, 简称NLP)是计算机科学与语言学中关注于计算机与人类语言间转换的领域,主要目标是让机器能够理解和生成自然语言,这样人们可以通过语言与计算机进行更自然的互动。 …...
Minio搭建并在SpringBoot中使用完成用户头像的上传
Minio使用搭建并上传用户头像到服务器操作,学习笔记 Minio介绍 minio官网 MinIO是一个开源的分布式对象存储服务器,支持S3协议并且可以在多节点上实现数据的高可用和容错。它采用Go语言开发,拥有轻量级、高性能、易部署等特点,并且可以自由…...
深入解析 Kubernetes CRD:原理、特点与典型应用场景
深入解析 Kubernetes CRD:原理、特点与典型应用场景 一、CRD 的本质与原理 1.1 什么是 CRD? CRD(Custom Resource Definition) 是 Kubernetes 提供的核心扩展机制,允许用户自定义 API 资源类型。通过 CRD,开发者可以将业务逻辑抽象为 Kubernetes 原生资源模型,实现与…...
【新手入门】SQL注入之盲注
一、引言 在我们的注入语句被带入数据库查询但却什么都没有返回的情况我们该怎么办? 例如应用程序返回到一个"通用的"的页面,或者重定向一个通用页面(可能为网站首页)。这时,我们之前学习的SQL注入的办法就无法使用了。这种情况我们称之为无…...
功能丰富的自动化任务软件zTasker_2.1.0_绿色版_屏蔽强制更新闪退
🚀 zTasker 一键式效率倍增器使用指南 🙏 致谢 首先感谢开发者提供如此高效的工具! 软件本身功能强大,但部分机制需特别注意! 📖 软件概述 zTasker 是一款通过自动化脚本/任务流实现效率飞跃的生产力工…...
YOLOv11-ultralytics-8.3.67部分代码阅读笔记-model.py
model.py ultralytics\models\yolo\model.py 目录 model.py 1.所需的库和模块 2.class YOLO(Model): 3.class YOLOWorld(Model): 1.所需的库和模块 # Ultralytics 🚀 AGPL-3.0 License - https://ultralytics.com/licensefrom pathlib import Pathfrom ult…...
深入浅出 Go 语言:协程(Goroutine)详解
深入浅出 Go 语言:协程(Goroutine)详解 引言 Go 语言的协程(goroutine)是其并发模型的核心特性之一。协程允许你轻松地编写并发代码,而不需要复杂的线程管理和锁机制。通过协程,你可以同时执行多个任务,并…...
【深度学习】Hopfield网络:模拟联想记忆
Hopfield网络是一种经典的循环神经网络,由物理学家John Hopfield在1982年提出。它的核心功能是模拟联想记忆,类似于人类大脑通过部分信息回忆完整记忆的能力。以下是通俗易懂的解释: 1. 核心思想 想象你看到一张模糊的老照片,虽然…...
为什么深度学习选择Tensor而非NumPy数组?核心优势深度解析
简短总结: 支持 GPU 加速:Tensor 提供对 GPU 的原生支持,能够有效加速计算,而 NumPy 则通常只能在 CPU 上运行。支持自动求导:深度学习模型的训练依赖于参数的优化,而 Tensor 提供了自动求导功能ÿ…...
MongoDB—(一主、一从、一仲裁)副本集搭建
MongoDB集群介绍: MongoDB 副本集是由多个MongoDB实例组成的集群,其中包含一个主节点(Primary)和多个从节点(Secondary),用于提供数据冗余和高可用性。以下是搭建 MongoDB 副本集的详细步骤&am…...
【Leetcode 每日一题】132. 分割回文串 II
问题背景 给你一个字符串 s s s,请你将 s s s 分割成一些子串,使每个子串都是回文串。 返回符合要求的 最少分割次数 。 数据约束 1 ≤ s . l e n g t h ≤ 2000 1 \le s.length \le 2000 1≤s.length≤2000 s s s 仅由小写英文字母组成 解题过程 …...
面试常问的压力测试问题
性能测试作为软件开发中的关键环节,确保系统在高负载下仍能高效运行。压力测试作为性能测试的重要类型,旨在通过施加超出正常负载的压力,观察系统在极端条件下的表现。面试中,相关问题常被问及,包括定义、重要性、与负…...