首页
学习
活动
专区
圈层
工具
发布

JS_基础知识点精讲

它是一个记录保存结构Record-keeping Structure允许我们能够执行函数调用的操作。 在调用栈中,每一个函数调用被一种叫做栈帧Frame的数据结构所替代。...Event Loop 事件循环是一个不停的从 宏任务队列/微任务队列中取出对应任务的「循环函数」。...宏任务队列是一个「FIFO」(先进先出)的队列结构。结构中存储的宏任务会被事件循环「探查」到。并且,这些任务是「同步阻塞」的。你可以将这些任务类比成一个函数对象。...宏任务是在循环中被执行,并且UI渲染「穿插」在宏任务中。 微任务是在一个宏任务完成之后,在UI渲染之前被触发。 ❝微任务队列是ES6新增的专门用于处理Promise调用的数据结构。...它和宏任务队列很像,它们最大的不同就是微任务队列是专门处理微任务的相关处理逻辑的。

1.4K10

【c++入门】引用,内联函数,auto

1.引用的基本概念与用法 引用是一个重要的概念,它提供了一种方式,通过它可以让两个不同的标识符(变量名、参数名等)引用同一个数据对象 在本质上,引用就像是数据对象的一个别名。...关键点在于没有产生任何拷贝,函数直接在原对象上工作 在本例中,当TestFunc2被调用,并且以A&(结构体A的引用)作为参数时,它实际上是直接操作原有的对象a,而不是创建一个新的拷贝。...,消耗比较大 在c语言中,我们可以用宏来解决 #define Add(x,y) ((x)+(y)) 在c++中,可以通过在函数声明前添加关键字inline来指示编译器将一个函数视为内联函数 inline...*p = &a; auto& r = a; 它的推导是十分灵活的 用auto声明指针类型时,用auto和auto*没有任何区别,但用auto声明引用类型时则必须加& 比如我们想创建一个函数指针...基于范围的for循环(C++11) 在C++98中如果要遍历一个数组,可以按照以下方式进行: void TestFor() { int array[] = { 1, 2, 3, 4, 5 }; for

37210
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    C++入门----内联函数&&auto&&范围for&&nullptr指针

    1.内联函数 顾名思义,内联函数也是函数的一种,我们在C语言的学习过程里面知道了函数和宏之间的区别和各自的优缺点; 函数的使用需要建立栈帧,宏的使用需要考虑各种符号的优先级问题,很容易出错,因为宏在使用的时候就是简单的替换...,不会建立栈帧(这个也是内联函数存在的原因,因为肯定要有自己的特定功能); 内联函数需要注意很多地方: (1)我们在定义内联函数的时候,不能把内联函数的定义和声明写在不同的文件里面(这个涉及到编译链接的相关知识...3.范围for 范围for就是用来遍历我们的数组的,我们之前在遍历数组的时候,是这样搞得: 当你学会了范围for之后,我们的数组遍历可以这样写: 是不是很方便,这里浅浅的解释一下自己的理解:我们的auto...就是一个类型的识别,我们这里的auto完全可以使用int进行代替,因为这里我们的数组就是int类型的数据,但是如果是其他的double等类型呢?...我们使用auto相当于是一个万能胶,什么类型的数组成员都是可以使用这个循环的; 我们的这个e相当于就是一个遍历过程里面的中间变量,我们数组里面的元素传递给e,然后进行打印输出e的结果,这个过程数组什么时候结束

    17810

    Event Loop 可视化解析讲解

    每个「栈帧」代表一次函数调用 「宏任务队列」是一个「FIFO」(先进先出)的队列结构。结构中存储的宏任务会被事件循环「探查」到。并且,这些任务是「同步阻塞」的。...事件循环 (Event Loop) 事件循环是一个不停的从 宏任务队列/微任务队列中取出对应任务的「循环函数」。在一定条件下,你可以将其类比成一个永不停歇的「永动机」。...在调用栈中,每一个函数调用被一种叫做「栈帧」(frame)的数据结构所替代。该结构能够帮助JS引擎(V8)保持函数之间的调用顺序和关系。...宏任务队列是一个「FIFO」(先进先出)的队列结构。结构中存储的宏任务会被事件循环「探查」到。并且,这些任务是「同步阻塞」的。你可以将这些任务类比成一个函数对象。...❝微任务队列是ES6新增的专门用于处理Promise调用的数据结构。它和宏任务队列很像,它们最大的不同就是微任务队列是专门处理微任务的相关处理逻辑的。 ❞ 2.

    76841

    一文带你搞懂浏览器的事件循环机制!

    JavaScript 的并发模型基于事件循环机制,它通过异步编程来实现高效的非阻塞 IO 操作。在 JavaScript 中,异步任务被分为宏任务和微任务,它们的执行顺序是由事件循环机制控制的。...JavaScript 意识到了这个问题,他们将任务分成了同步任务和异步任务,对于二者有不同的处理。 栈 Stack 函数调用形成了一个由若干帧组成的栈。...当 bar 调用 foo 时,第二个帧被创建并被压入栈中,放在第一个帧之上,帧中包含 foo 的参数和局部变量。当 foo 执行完毕然后返回时,第二个帧就被弹出栈(剩下 bar 函数的调用帧)。...在计算机科学中,堆(Heap)是一种常见的数据结构。它是一个特殊的完全二叉树(或者可以看作是一个数组),其中每个节点都满足堆属性。...在 事件循环期间的某个时刻,运行时会从最先进入队列的消息开始处理队列中的消息。被处理的消息会被移出队列,并作为输入参数来调用与之关联的函数。正如前面所提到的,调用一个函数总是会为其创造一个新的栈帧。

    1.5K30

    宏任务是异步还是同步?再谈事件循环

    即便是在 JavaScript 中,也存在浏览器和 Node 两种不同的事件循环机制。可见,事件循环是一个概念,不同技术对它的实现细节不尽相同。实际上,事件循环驱动着浏览器中发生的一切。...不过本文重点介绍它如何负责调度和执行在其线程中运行的每一段代码。调用栈在 JavaScript 中使用了一个叫调用栈(Call Stack,也叫执行栈)的机制来管理函数的调用顺序。...执行到一个由 setTimeout() 或 setInterval() 创建的 timeout 或 interval,相应的回调函数被添加到任务队列时。从定义可以看出,宏任务跟同步、异步无关。...微任务的执行是为了确保代码的顺序性和一致性,在进入下一个宏任务之前,先把本轮循环中的所有微任务执行完毕。在开头的例子中,乙去拿他煮好的米粉就相当于执行一个微任务的回调。...执行递归函数时,调用栈是如何运作的在递归函数的每一次递归调用时,都会生成新的栈帧并压入调用栈。这意味着每一次递归,调用栈都会增加一个新帧。

    49611

    【C++入门篇】学习C++就看这篇--->内联函数、auto关键字、范围for

    解释:什么意思,怎么就牺牲空间了,你看你每次调用是不是都要展开,那可想而知,你调用100次展开100次那这个代码量吓人,而你之前的不一样啊,之前函数有它独立的栈帧你每次调用就可以了。...内联函数就可以替代宏函数(短小函数定义) 2....,如果是想要修改其中的值是不行的,因为e是另开辟的一个空间与数组没有任何关系,它无法进行修改,证明如下: 所以上面那个范围for可以这样理解,将array数组中的每个元素依次赋值给e,并且每次循环后会自动...不清楚大家有这样的疑惑没,如果大家也有这样的疑惑,我们真是同道中人,经过我的查阅,下面为大家解惑: 在C++的范围for循环中,auto& e 在每次迭代时都会创建一个新的引用变量,并将其绑定到当前处理的元素上...如果一个指针没有合法的指向,我们基本都是按照如下 方式对其进行初始化: int* p1 = NULL; int* p2 = 0; NULL实际是一个宏,在传统的C头文件(stddef.h)中,可以看到如下代码

    31210

    【C++篇】C++入门基础(二)

    因此,后续可以利用ret修改返回值n的值 返回值不可让它在栈帧中创建,否则返回值将会丢失,得到的是随机值。可以创建在静态区等等。...隐式类型转换的原理:创建一个临时变量,该临时变量是转换后的类型,将被转换的变量拷贝到临时变量,再将临时变量拷贝到目标变量中,完成类型转换。...宏函数与内联函数 宏函数的优缺点: 优点:不需要建立栈帧,提高调用效率 缺点:复杂,容易出错、可读性差、不能调试 例如写一个Add宏函数: #define Add(x, y) ((x)+(y)) 大多数人稍不小心就出错了...,continue与break都可以正常使用 5.2 范围for的使用条件 for循环迭代的范围必须是确定的 对于数组而言,就是数组中的第一个元素和最后一个元素的范围 错误示例: void TestFor...四、指针空值nullptr关键字 在C语言中,我们都用NULL来给指针设置空值 但NULL实际是一个宏,在传统的C头文件(stddef.h)中,可以看到如下代码: #ifndef NULL #ifdef

    25310

    R语言动态可视化:制作历史全球平均温度的累积动态折线图动画gif视频图

    p=9766  在某些情况下,你可能希望通过在每帧中添加数据并保留先前添加的数据来进行动画处理。 现在,我们将通过制作点线图的动画来探索。...使用for循环绘制并保存每年的图表 要制作点和线的累积动画,我们需要编写一个循环为每帧创建一个单独的图像。...这部分代码将遍历列表中的每个条目:for (y in years)。 该代码使用相同的原理来绘制并保存每年的图表: 该代码如何工作 对于每一年,y该代码首先都会使一个称为R的R对象。...然后,它创建一个名为的R对象chart,这是从该数据绘制的静态ggplot2图表。 然后,使用该ggsave函数以定义的尺寸和分辨率保存该图表,从而在循环上进行进度更新。...制作动画,在模拟人类对全球平均气温的影响与自然影响之间进行切换 循环动画还可以用于在不同状态或数据的筛选视图之间切换。

    2.4K11

    JavaScript Event Loop

    事件循环是通过任务队列的机制进行协调的。一个事件循环中,可以有一个或多个任务队列,而每个任务都有一个任务源。 来自同一个任务源的任务任务必须放到同一个任务队列,不同源则被添加到不同的任务队列。...在事件循环期间的某个时刻,运行时会从最先进入队列的消息开始处理队列中的消息。被处理的消息会被移出队列,并作为输入参数来调用与之关联的函数。调用一个函数总是会为其创造一个新的栈帧。...函数的处理会一直进行到执行栈再次为空为止;然后事件循环将会处理队列中的下一个消息(如果还有的话)。 宏任务(macrotask) 上面说了不同源则被添加到不同的任务队列,宏任务就是一种任务源。...而 process.nextTick() 函数是在事件循环开始之前执行。当多次调用 setImmediate() 时, 它的回调函数将按照创建它们的顺序排队等待执行。...setImmediate 也可以说是预定在 I/O 事件的回调之后立即执行的回调(在 poll 队列中会遍历回调队列并同步执行)。

    1.7K20

    R语言动态可视化:制作历史全球平均温度的累积动态折线图动画gif视频图

    p=9766  在某些情况下,你可能希望通过在每帧中添加数据并保留先前添加的数据来进行动画处理。 现在,我们将通过制作点线图的动画来探索。...使用for循环绘制并保存每年的图表 要制作点和线的累积动画,我们需要编写一个循环为每帧创建一个单独的图像。...这部分代码将遍历列表中的每个条目:for (y in years)。 该代码使用相同的原理来绘制并保存每年的图表: 该代码如何工作 对于每一年,y该代码首先都会使一个称为R的R对象。...然后,它创建一个名为的R对象chart,这是从该数据绘制的静态ggplot2图表。 然后,使用该ggsave函数以定义的尺寸和分辨率保存该图表,从而在循环上进行进度更新。...制作动画,在模拟人类对全球平均气温的影响与自然影响之间进行切换 循环动画还可以用于在不同状态或数据的筛选视图之间切换。

    24200

    【C++干货基地】揭秘C++11常用特性:内联函数 | 范围for | auto自动识别 | nullptr指针空值

    一、内联函数 1.1 内联函数的概念 以往我们在C语言中实现比较简单的函数来说都是用宏来实现的,比如说实现一个加法,但是用宏实现的小型函数有很多缺点: 第一点就是宏经常容易写错,末尾的引号问题和运算符优先级问题等等...第二点就是宏他并没有类型安全检查就算是一个加法也有可能有人给你传俩个字符 第三点就是宏不方便调试,导致代码可读性差 所以在C++中就采用了内联函数和枚举来解决宏的使用的问题 以inline修饰的函数叫做内联函数...其实函数在调用次数过多的情况下就不适合使用内联函数,这样就会导致代码膨胀到处都是重复的代码,从而使得可执行程序变大; 还有在函数的递归时也不能使用内联函数,函数栈帧是可以复用的,但内联函数一旦使用也会导致代码膨胀...对于数组而言,就是数组中第一个元素和最后一个元素的范围; 对于类而言,应该提供begin和end的方法,begin和end就是for循环迭代的范围。...,所以在C++11中新增了一个关键字来填这个缺陷 4.2 nullptr的由来 nullptr 的由来就是因为祖师爷在一开始定义 NULL是使用宏定义这就导致 NULL 被替换成 0 了,而不是((void

    28900

    Javascript之异步循环打印这道小题

    ,setTimeout并不是按照我们所想的那样,在循环的内部依次执行的,原因在于setTimeout是一个异步回调的宏任务,他会在执行到该代码的时候,把传入setTimeout的回调函数及参数信息存在一个延迟队列中...那么我们来分析下上面的代码是怎么执行的,每一次循环的时候,都会执行立即执行函数,立即执行函数会形成一个栈帧插入到栈顶,那么在执行到立即执行函数中的异步回调setTimeout的时候,会在延迟队列中添加一个回调函数...而块级作用域,实际上是把变量信息存储在了执行上下文栈帧中的词法环境中的,但是这里,注意这里,在执行上下文栈中仅仅只有一个全局的根栈帧,每一次循环都会绑定词法环境中的变量i,就有点像闭包一样。...首先,作用域是在函数声明时就已经确定好的,存储在执行函数的执行上下文栈帧中的。其次,闭包则像是某一个函数的背包,在它自己的执行上下文栈帧中找不到的时候,就会去闭包中找。...generator可以理解为一个状态机,它的内部会使用yield表达式产出状态,我们可以这样来创建一个generator函数,通过执行generator函数,会返回一个遍历器对象,也就是Iterator

    2.2K30

    PHP虚拟机

    called_scope是static ::在PHP代码中引用的范围。 prev_execute_data指向前一个栈帧,在此函数完成运行后,执行将返回到该帧。...更典型的情况是当提取返回一个INDIRECT时,它包含一个指向正在被修改的存储位置的指针,例如哈希表数据数组中的某个位置。...原因是虚拟机可能正在处理与执行数据中存储的opline不同步opline变量。...假设我们确实在try块内,VM需要清理在抛出opline之前开始的所有未完成的操作,并且不会跨越try块的末尾。 这涉及释放当前在使用中的所有调用的栈帧和相关数据,以及释放临时变量。...如果没有catch(最后也没有),我们展开堆栈,也就是销毁当前的堆栈帧并在处理异常时给父帧一个shot。 因此,您可以充分理解整个异常处理业务的丑陋程度,我将介绍与抛出析构函数相关的另一个小技巧。

    2.9K10

    在chromev8中的JavaScript事件循环分析

    这个模型与其它语言中的模型截然不同,比如 C 和 Java。 依赖概念 [依赖概念.png] 栈 函数调用形成了一个由若干帧组成的栈。...当bar调用foo时,第二个帧被创建并被压入栈中,放在第一个帧之上,帧中包含foo的参数和局部变量。当foo执行完毕然后返回时,第二个帧就被弹出栈(剩下bar函数的调用帧 )。...队列 一个JavaScript运行时包含了一个待处理消息的消息队列。每一个消息都关联着一个用以处理这个消息的回调函数。 在事件循环期间的某个时刻,运行时会从最先进入队列的消息开始处理队列中的消息。...这个过程可以是无限进行下去的,除非发生了栈溢出,即超过了所能使用内存的最大值。 [页面崩溃.png] 以上的过程说的都是同步代码的执行。那么当一个异步代码(如发送ajax请求数据)执行后会如何呢?...在事件循环中,每进行一次循环操作称为tick,每一次tick的任务处理模型是比较复杂的,但关键步骤如下: 执行一个宏任务(栈中没有就从事件队列中获取) 执行过程中如果遇到微任务,就将它添加到微任务的任务队列中

    5.1K40

    我的C++奇迹之旅:内联函数和auto关键推导和指针空值

    举个例子,当你在一个项目中,想要频繁调用一个Add函数 int Add(int x, int y) { return x + y; } 当你调用一千次,一万次,函数栈帧相应的要建立这么多次,对于代码空间和时间考虑...这是反汇编对比图: 查看内联函数inline方式 查看内联函数的方式确实需要根据编译模式的不同而采取不同的方法: 在 Visual Studio 2019 中,查看内联函数的步骤如下: 在 Debug...这是 C++ 语言的一个特性限制。 在 C++ 中,数组是一种特殊的数据结构,它的大小和元素类型在编译时就必须确定。而 auto 关键字是用来进行类型推导的,它无法推导出数组的大小和元素类型。...基于范围的for循环(C++11) 范围for的语法 在C++98中如果要遍历一个数组,可以按照以下方式进行: int main() { int array[] = { 1, 2, 3, 4, 5 }...使用范围 for 循环遍历指针是不合适的,因为循环的范围是未知的。 .

    58110

    浏览器原理学习笔记04—浏览器中的页面事件循环系统

    :引入事件循环机制,让该线程"活"起来 循环机制:通过一个 for 循环语句来监听是否有新的任务,线程会一直循环执行 事件系统:用户事件阻塞进程执行 [r45kgjr0pl.png] 模型3...for 循环,不断地从多个消息队列中选出一个最老的任务 oldestTask 设置为当前任务,执行完成后从消息队列中删除并统计时长等信息,这些消息队列中的任务称为宏任务。...MutationObserver 将其改成异步调用,使用一个能记录多次 DOM 变化记录的数据结构,一次性触发异步调用,为保证实时性不能使用 setTimeout 创建宏任务触发回调,渲染引擎将变化记录封装成微任务添加进当前任务的微任务队列中...执行环境,添加微任务并在 JavaScript 执行结束时取出执行,可以得到结论: 每个宏任务关联一个微任务队列 微任务的执行时长会影响当前宏任务的时长 在一个宏任务中分别创建一个用于回调的宏任务和微任务...(onResolve) Promise 将回调函数的返回值穿透到最外层 通过将回调函数中创建的 Promise 对象返回到最外层可以摆脱嵌套循环。

    2K168

    浏览器内核

    事件循环 JS 是单线程运行的,同一时间只能运行一个任务,为了避免耗时较长的异步任务阻塞主线程的运行,V8 等引擎引入了 事件循环 机制。 在 JS 中,异步任务分为宏任务和微任务。...,先执行微任务队列中的任务; 当微任务执行完成后,调度执行宏任务队列,每一个宏任务都将开启一次新的事件循环 正因 JS 的事件循环机制,Node.js 具有高并发高性能的优点。...标记-清除算法 在 JS 中,不仅函数是对象,函数的执行上下文也是对象,这个对象在函数执行时被创建,在函数执行结束时被销毁。...函数每次执行都会产生一个新的执行上下文,存放在函数的私有属性 [[scope]] 中,它维护着对函数形参和局部变量的引用。...[[scope]] 可以理解为是一个链表节点,存放着函数自身的执行上下文,它的指针指向父级的 [[scope]]。

    1.3K20

    C++入门(下)

    语言阶段,我们学习过,函数调用是会建立栈帧的,每次函数调用完以后会销毁栈帧,上述代码中,返回的并不是变量a,而返回的是变量a的拷贝,也就是说,在Function1函数销毁以前,将变量a的值拷贝给一个临时对象...,因此result的结果要取决于在什么样的平台下,不同的平台有不同的结果 博主使用的vs2022是没有在函数栈帧销毁之后进行清理的,因此这里result2的值为0.但是我们来看下面这个场景....在sizeof中的含义不同:sizeof(引用)结果为引用的数据类型的大小.但指针始终是地址空间所占的字节数,在32位平台下为4个字节,在64位平台下为8个字节....因此,inline对于编译器只是一个建议,不同的编译器对于inline的实现机制可能不同,一般建议:将函数规模较小,不是递归、且频繁调用的函数可以使用inline修饰 使用inline修饰的函数,不建议声明与定义分离...++中,我们可以使用typeid().name()这个函数来查看变量的数据类型.通过观察我们可以发现,变量a是一个整型,变量b是字符类型,pf是一个函数指针,指向Test函数.我们可以发现定义一个函数指针变量是不是比较麻烦

    8310

    vue源码中的nextTick是怎样实现的

    调用 timerFunc 函数,在其中遍历 callbacks 执行每个函数,因为 timerFunc 是一个异步执行的函数,且定义一个变量 pending来保证一个事件循环中只调用一次 timerFunc...5、创建异步执行函数的顺序 Vue 历来版本中在 nextTick 函数中实现 timerFunc 的顺序时做了几次调整,直到 2.6+ 版本才稳定下来 第一版的 nextTick 函数中实现 timerFunc...为了解决这个问题,您可以简单地给两个外部div不同的键,以强制在更新期间替换它们。这将阻止接收冒泡事件。...点击事件是个宏任务,当点击事件执行完后触发的 nextTick(宏任务)上的更新,只会在下一个事件循环中进行,这样其事件冒泡早已执行完毕。就不会出现 BUG 中的情况。...所以 Vue 觉得用微任务创建的 nextTick 可控性还可以,不像用宏任务创建的 nextTick 会出现不可控场景。

    81910
    领券