JavaScript进阶--作用域-函数进阶

Javascript进阶

作用域

分类

  • 局部
    • 函数 ==>执行完变量被清空
    • 块 ==>用{}包住 ==>有可能被无法访问 【用var声明的变量】
  • 全局 ==> 在script标签和.js文件最外层进行声明

作用域链

最底层的变量查找机制 ==> 在函数被执行时,会优先查找当前函数作用域中查找变量,找不到再找父级作用域

垃圾回收机制 Garbage Collection

JS中内存的分配和回收都是自动完成的

内存的生命周期

内存分配–>内存使用 -->内存回收

全局变量一般不会回收,直至关闭页面

内存泄漏

程序中分配内存未释放或无法释放由于某种原因

JS垃圾回收机制 - 算法说明

堆和栈

  • 栈:操作系统自动分配函数参数局部变量【基本数据类型】
  • 堆:由程序员分配释放,或者通过垃圾回收机制【复杂数据类型】
引用计数法【基本不使用了】

若对象无指向它的引用,进行回收

[!NOTE]

设置count变量来保存对于某变量的引用次数,引用一次自增,减少引用自减,当count变为0,释放内存

引用的意思是是否有变量名或者指针保存复杂数据类型变量的地址

若复杂数据类型互相指向,则count永不为0,导致内存泄漏

标记清除法

从根部(即

闭包 - closure

简单理解:内层函数 use–> 外层函数变量

作用

封闭数据,提供操作,外部也可以访问函数内部的变量

闭包机制

 function folder() {let a = 1function fn() {console.log(a)}fn()}folder()

效果为

在这里插入图片描述

右边的Closure就是所谓的闭包

Local:局部变量

Global:全局变量

常见闭包形式

function outer() {let a = 1function inner() {console.log(a);}return inner;}let b = outer();b(); // 1

[!IMPORTANT]

相当于外部函数可以调用inner()函数,间接使用到,修改到函数内部变量,但不会让外部直接堆变量进行修改

借此实现数据的私有。 但由于始终可以查找到变量,导致变量无法被释放,产生内存泄漏的问题

变量提升

允许变量声明之前被访问(var声明变量)

const和let声明的变量不会出现这种情况

内部会先检查有无var声明的变量,若有,则将声明提前,赋值不会提前

 console.log(a); // undefinedvar a = 10;console.log(a); // 10

在这里插入图片描述

函数进阶

函数提升

函数在声明之前可以被调用(在同等作用域下,提到最前面)

若被调用的函数为赋值得到的,则不可行,因为变量提升只提升声明,不含赋值

 // 函数提升fn()function fn() {console.log('函数提升')}// 变量提升fun()var fun = function () {console.log('变量提升')}

函数参数

动态参数

函数内置 arument

  • 伪数组
  • 只存在函数中

调用时有参数,定义时括号内无参数

 function addAll() {let sum = 0;for (let i = 0; i < arguments.length; i++) {sum += arguments[i];}return sum;}console.log(addAll(1, 2, 3, 4, 5)); //15console.log(addAll(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)); //55
剩余参数

将不定数量的多余实参变为一个真数组

function sum(a, b, ...rest) {let result = a + b;for (let i = 0; i < rest.length; i++) {result += rest[i];}return result;}console.log(sum(1, 2, 3, 4, 5)); // 15console.log(sum(1, 2)); // 3console.log(sum(1, 2, 3, 4, 5, 6)); // 21
展开运算符

...将数组展开(或者对象等)

应用

  • 求数组最大组 --Math.max()
  • 合并数组
const arr = [1, 2, 3, 4, 5]console.log(...arr)console.log(Math.max(...arr))console.log(Math.min(...arr))const arr1 = [1, 2, 3, 4, 5]const arrAll = [...arr1, ...arr]console.log(...arrAll)

箭头函数

以更简洁的方式写匿名函数

语法技巧

  • 只有一个参数,可以省略括号
  • 函数只有一行代码可以省略大括号
  • 只有一句return语句,可省略return
  • 可用来返回对象
 // 箭头函数const add = (a, b) => {console.log(a + b);return a * b}add(2, 3); // 5const double = a => a * 2;double(3); // 6const item = (uname) => ({ name: uname })console.log(item('John'))// {name: 'John'}

只可以用剩余参数

const all = (...arr) => console.log(...arr);all(1, 2, 3, 4, 5); // 1 2 3 4 5

不会创建自己的this,只会从自己的作用域的上一层沿用this

回调函数不推荐使用箭头函数

//this指向const a1 = () => thisconsole.log(a1()); // windowconst a2 = function () {let i = 1const a3 = () => thisconsole.log(a3()); // window}a2();const obj = {uname: "shaly",sayName: () => this}console.log(obj.sayName()) // shalyconst obj2 = {uname: "shaly",sayName: function () {const a4 = () => thisconsole.log(a4())}}console.log(obj2.sayName())

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

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

相关文章

路径跟踪之导航向量场——二维导航向量场

今天带来一期轨迹跟踪算法的讲解&#xff0c;首先讲解二维平面中的导航向量场[1]。该方法具有轻量化、计算简便、收敛性强等多项优点。该方法根据期望的轨迹函数&#xff0c;计算全局位置的期望飞行向量&#xff0c;将期望飞行向量转为偏光角&#xff0c;输入底层控制器&#x…

【STM32单片机_(HAL库)】4-5-3【定时器TIM】【感应开关盖垃圾桶项目】项目实现

1.项目需求 以下几个事件触发时&#xff0c;垃圾桶自动开盖&#xff0c;并伴随蜂鸣器短响一声&#xff0c;同时 LED 灯闪烁一下&#xff0c;2秒后自动关盖&#xff1a; 检测到有人靠近检测到有震动按下按键 KEY1 2.硬件 STM32单片机最小系统震动传感器模块蜂鸣器模块&#…

CentOS 6文件系统

由冯诺依曼在 1945 年提出的计算机五大组成部分&#xff1a;运算器&#xff0c;控制器&#xff0c;存储器&#xff0c;输入设 备&#xff0c;输出设备。 1. 硬盘结构&#xff1a; &#xff08;1&#xff09;机械硬盘结构&#xff1a; 磁盘拆解图&#xff1a; 扇区&#xff0c;…

研发中台拆分之路:深度剖析、心得总结与经验分享

背景在 21 年&#xff0c;中台拆分在 21 年&#xff0c;以下为中台拆分的过程心得&#xff0c;带有一定的主观&#xff0c;偏向于中小团队中台建设参考&#xff08;这里的中小团队指 3-100 人的团队&#xff09;&#xff0c;对于大型团队不太适用&#xff0c;毕竟大型团队人中 …

UGUI(六大UI根基组件)

Rect Transform 各种参数 是显示pos还是width/height 还是left/top/right/bottom之类巴拉巴拉&#xff0c;各种混合的展示baby&#xff0c;都是看anchor的设置 pivot的设置影响具体数值 至于blueprint mode &#xff0c;就是用了之后框框不变&#xff0c;who wanna do thi…

理解PID(零)——什么是PID

PID控制器是一种广泛用于各种工业控制场合的控制器&#xff0c;它结构简单&#xff0c;可以根据工程经验整定参数Kp,Ki,Kd. 虽然现在控制专家提出了很多智能的控制算法&#xff0c;比如神经网络&#xff0c;模糊控制等&#xff0c;但是PID仍然被广泛使用。常见的PID控制器有位置…

开源全文搜索(搜索引擎)

吃水不忘挖井人&#xff0c;介绍Doug Cutting大牛是十分有必要的。 最早&#xff0c;接触到搜索引擎&#xff0c;知道有个Nutch&#xff08;开源搜索引擎&#xff09;&#xff0c;于是开始查看Nutch相关的资料&#xff0c;发现了Nutch的创始人Doug Cutting&#xff0c;随着项目…

初创公司首选HR软件推荐与功能解析

初创企业需HR软件自动化招聘、文书、日常任务及合规管理&#xff0c;提升效率。ZohoPeople是理想选择&#xff0c;性价比高&#xff0c;版本多样&#xff0c;满足不同需求。 1、简化招聘流程 您一直在寻找杰出的人才&#xff0c;以助您的初创企业飞跃发展。您选择的HR软件应该…

Python数字图像处理实战——基于OpenCV实现多种滤波器(附完整代码和结果图)

Python数字图像处理实战——基于OpenCV实现多种滤波器&#xff08;附完整代码和结果图&#xff09; 关于作者 作者&#xff1a;小白熊 作者简介&#xff1a;精通python、matlab、c#语言&#xff0c;擅长机器学习&#xff0c;深度学习&#xff0c;机器视觉&#xff0c;目标检测…

极客兔兔Gee-Cache Day7

protobuf配置&#xff1a; 从 Protobuf Releases 下载最先版本的发布包安装。解压后将解压路径下的 bin 目录 加入到环境变量即可。 如果能正常显示版本&#xff0c;则表示安装成功。 $ protoc --version libprotoc 3.11.2在Golang中使用protobuf&#xff0c;还需要protoc-g…

LSTM时间序列模型实战——预测上证指数走势

LSTM时间序列模型实战——预测上证指数走势 关于作者 作者&#xff1a;小白熊 作者简介&#xff1a;精通python、matlab、c#语言&#xff0c;擅长机器学习&#xff0c;深度学习&#xff0c;机器视觉&#xff0c;目标检测&#xff0c;图像分类&#xff0c;姿态识别&#xff0c;…

影刀RPA实战:Excel排序、替换与格式

1.实战目标 今天继续介绍影刀RPA操作Excel的指令&#xff0c;内容替换&#xff0c;数据排序与单元格格式设置&#xff0c;这几个功能在日常工作中使用率还是比较频繁的。我们可以使用影刀来处理这些重复繁琐的工作。 2.内容替换 我们手动替换内容时 打开Excel文件&#xff1…

鸿蒙进入“无人区”:该如何闯关?

按照华为方面的说法&#xff0c;“打造鸿蒙操作系统是三大战役&#xff0c;目前已经完成了底座和体验两大战役&#xff0c;第三大战役则是生态。”生态固然重要&#xff0c;但要让鸿蒙与当今世界主流操作系统抗衡&#xff0c;乃至成为新一代操作系统中的翘楚&#xff0c;其实还…

上市四天暴涨又暴跌,扫描全能王背后公司坐上“过山车”

股价四天涨五倍&#xff0c;遇到回调跌一半&#xff0c;扫描全能王母公司——合合信息&#xff0c;一上市就坐上了“过山车”。 合合信息其实早在2021年就向科创板申请上市&#xff0c;并在2023年成功过会&#xff0c;但直到9月13日才开启申购&#xff0c;IPO之路一走就是三年…

springboot-网站开发-thymeleaf引擎报错找不到指定的页面模板文件

springboot-网站开发-thymeleaf引擎报错找不到指定的页面模板文件&#xff01; 这种错误的情况&#xff0c;发生&#xff0c;一般都是因为&#xff0c;我们自己的html模板文件&#xff0c;存档位置并不是在默认的templates下面。而是我们自己新建的一个子目录里面。然后&#x…

又被Transformer秀到了!结合小样本学习发A会!

在有限的数据资源下&#xff0c;为了训练出高性能的机器学习模型&#xff0c;我们常会考虑Transformer小样本学习。 这是因为Transformer能从有限的数据中提取更多有用的信息&#xff0c;这样与小样本学习结合&#xff0c;可以更有效的帮助我们提高模型的性能&#xff0c;加速…

Vue84 vue3项目结构分析

打开main.js文件&#xff0c;发现和vue2不同 //引入的不再是Vue构造函数了&#xff0c;引入的是一个名为createApp的工厂函数 import { createApp } from vue import App from ./App.vue//创建应用实例对象——app(类似于之前Vue2中的vm&#xff0c;但app比vm更“轻”) const …

Chrome(谷歌)浏览器 数据JSON格式美化 2024显示插件安装和使用

文章目录 目录 文章目录 安装流程 小结 概要安装流程技术细节小结 概要 没有美化的格式浏览器展示 美化之后效果图 安装流程 下载地址 https://github.com/gildas-lormeau/JSONVue 点击下载 下载成功&#xff0c;如图所示 解压文件 添加成功&#xff0c;如图所示 通过浏览器…

Python测试框架--Allure

严格意义上讲 Allure 不算是测试框架&#xff0c;但是它是生成漂亮测试报告的开源工具&#xff0c;搭配 Pytest 测试框架食用更搭。 也就是说 Allure 是在 Pytest 执行完生成的测试数据的基础上&#xff0c;对测试数据进行处理统计&#xff0c;生成格式统一、美观的测试报告。 …

C语言函数栈帧的创建与销毁(32)

文章目录 前言一、什么是函数栈帧&#xff1f;二、理解函数栈帧能解决什么问题&#xff1f;三、函数栈帧的创建和销毁解析什么是栈&#xff1f;认识相关寄存器和汇编指令 四、解析函数栈帧的创建和销毁预备知识函数的调用堆栈准备环境转到反汇编函数栈帧的创建函数栈帧的销毁 五…