首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

详解 JS 中的事件循环、宏微任务、Primise对象、定时器函数,以及其在工作中的应用和注意事项

为什么会然想到写这么一个大杂烩的博文呢,必须要从笔者几年前的一次面试说起 当时的我年轻气盛,在简历上放了自己的博客地址,而面试官应该是翻了我的博客,好几道面试题都是围绕着我的博文来提问 其中一个问题,直接使得空气静止了五分钟...这个函数是专门为动画和连续的视觉更新设计的,它可以帮助你创建平滑的动画效果,因为它能保证在浏览器进行下一次重绘之前更新动画帧。...简单的使用方式:requestAnimationFrame 只需要一个回调函数作为参数,浏览器会自动计算出最适合的调用时间。...,animate 函数会被连续调用,每次调用都会将元素向右移动5像素,直到它达到500像素的位置。...解决状态更新问题:有时候,你可能在同一方法中多次更改数据,使用 nextTick 可以确保所有的 DOM 更新都完成后再执行某些操作。

29610

JavaScript—事件

JavaScript—事件 事件机制: 在用户使用键盘、鼠标等设备进行操作时,实际上每一次的操作都是在发起一个事件。...事件委托: 这其中有一个事件委托的概念,我们需要在代码中把事件委托也可以说是注册到按钮上,这时会有一个监听器监听着这个按钮,当用户点击按钮时就会去调用委托事件中的代码,这些代码都写在函数中。...例如:我把一段打印Hello World的函数,通过事件委托到按钮上,当我点击这个按钮的时候就会调用这个函数,函数执行完之后就会打印Hello World。...第三种方式,通过addEventListener函数添加一个事件监听器,需要传递事件的名称,和函数对象,函数对象可以是函数的名称,也可以是直接写一个函数上去: 代码示例: ? 运行结果: ?...同一个元素对象的同一个事件,可以添加多个函数,这些函数可以执行不同的内容,例如我在一个button元素的mouseover事件中分别添加了三个函数,这三个函数各自打印了一句话,那么当我鼠标碰到按钮时,就会打印出三句话

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

    《JavaScript 模式》读书笔记(7)— 设计模式1

    大家好,又见面了,我是你们的朋友全栈君。   这些模式已经出现了相当长的一段时间,并被证明在许多情况下都非常有用。这也是为什么需要自己熟悉并谈论这些模式的原因。   ...这意味着当您第二次使用同一个创建新对象的时候,应该得到与第一次创建的对象完全相同的对象。   但是,如何将这种模式应用到JavaScript?在JavaScript中没有类,只有对象。...需要Universe构造函数缓存该对象实例的this,以便当第二次调用该构造函数时能够创建并返回同一个对象。有多种选择可以实现这一目标: 可以使用全局变量来存储该实例。...对象的消费者并不需要知道如何组织数据,所有需要做的就是取出单个数据进行工作。   在迭代器模式中,我们需要提供一个next()方法。一次调用next()必须返回下一个连续的元素。...当实现迭代器模式时,私下的存储数据和指向下一个可用元素的指针是很有意义的,为了演示一个实现示例,让我们假定数据只是普通数组,而“特殊”的检索下一个连续元素的逻辑为返回每隔一个的数组元素。

    45130

    JavaScript -1- 基础教程与部分功能示例

    JavaScript 是属于 HTML 和 Web 的编程语言,编程令计算机完成您需要它们做的工作。本文记录基础教程与部分功能。...("demo").innerHTML = "我的第一段 JavaScript"; 旧的 JavaScript 例子也许会使用 type 属性:函数调用 函数中的代码将在其他代码调用该函数时执行: 当事件发生时(当用户点击按钮时) 当 JavaScript 代码调用时 自动的(自调用) 函数返回 当 JavaScript 到达 return...如果函数被某条语句调用,JavaScript 将在调用语句之后“返回”执行代码。 函数通常会计算出返回值。...这个返回值会返回给调用者: 优势 能够对代码进行复用:只要定义一次代码,就可以多次使用它。 能够多次向同一函数传递不同的参数,以产生不同的结果。

    72120

    一篇文章带你了解JavaScript函数

    一个JavaScript函数是一个为执行特定任务而设计的代码块,JavaScript函数当调用时被执行。...如果从一个语句调用了函数,JavaScript将“回归”到调用语句后继续执行代码。 函数通常计算返回值. 返回值返回给调用者。...函数 此示例调用一个函数,该函数执行计算并返回结果: function myFunction(a,...二、为什么使用函数? 您可以重用代码:定义代码一次,并多次使用它。 您可以使用同一代码多次使用不同的参数,产生不同的结果。...三、总结 文章主要从俩个方面介绍了JavaScript函数的应用,从函数的语法,怎么去调用函数,函数的返回值,以及在编程中为什么需要函数的加入等等,都做了详细讲解。

    34440

    《JavaScript 模式》读书笔记(7)— 设计模式1

    这意味着当您第二次使用同一个创建新对象的时候,应该得到与第一次创建的对象完全相同的对象。   但是,如何将这种模式应用到JavaScript?在JavaScript中没有类,只有对象。...但是JavaScript中具有new语法可使用构造函数来创建对象,而且有时可能需要使用这种语法的单体实现。...需要Universe构造函数缓存该对象实例的this,以便当第二次调用该构造函数时能够创建并返回同一个对象。有多种选择可以实现这一目标: 可以使用全局变量来存储该实例。...对象的消费者并不需要知道如何组织数据,所有需要做的就是取出单个数据进行工作。   在迭代器模式中,我们需要提供一个next()方法。一次调用next()必须返回下一个连续的元素。...当实现迭代器模式时,私下的存储数据和指向下一个可用元素的指针是很有意义的,为了演示一个实现示例,让我们假定数据只是普通数组,而“特殊”的检索下一个连续元素的逻辑为返回每隔一个的数组元素。

    53240

    Vue0.11版本源码阅读系列五:批量更新是怎么做的

    >我也是 window.vm.show = true window.vm.show = false 比如有两个指令依赖同一个属性或者连续修改某个属性,如果不进行批量异步更新,那么就会多次修改...has[id]用来跳过同一个watcher的重复添加 if (!...批量很容易理解,都放到一个队列里,最后一起执行就是批量执行了,但是要理解MutationObserver的回调或者setTimeout的回调为什么能异步调用就需要先来了解一下JavaScript语言里的事件循环...简单的说就是因为JavaScript是单线程的,所以任务需要排队进行执行,前一个执行完了才能执行后面一个,但有些任务比较耗时而且没必要等着,所以可以先放一边,先执行后面的,等到了可以执行了再去执行它,比如有些...show的值都会触发这两个watcher的更新,也就是会调两次batcher.push(this)方法,第一次调用后会执行_.nextTick(flush)注册一个回调,连续两次修改show的值,会调用四次上述提到的

    44120

    在 JavaScript 中通过 queueMicrotask() 使用微任务

    ,当创建该函数的函数执行之后,并且 只有当 Javascript 调用栈为空,而控制权尚未返还给被 用户代理 用来驱动脚本执行环境的事件循环之前,该微任务才会被执行。...简单的传入一个 JavaScript 函数,以在 queueMicrotask() 方法中处理微任务时供其上下文调用即可;取决于当前执行上下文,queueMicrotask() 以定义的形式被暴露在 Window...批量操作 也可以使用微任务从不同来源将多个请求收集到单一的批处理中,从而避免对处理同类工作的多次调用可能造成的开销。...这使得同一次事件循环迭代期间发生的每次 sendMessage() 调用将其消息添加到同一个 fetch() 操作中,而不会让诸如 timeouts 等其他可能的定时任务推迟传递。...这次调用包含了 log(),一个简单的向屏幕输出文字的自定义函数。

    3.2K10

    V8内存管理及垃圾回收机制

    JavaScript引擎的内存空间主要分为栈和堆。 栈 栈是临时存储空间,主要存储局部变量和函数调用。...引用类型赋值,系统会为新的变量在栈内存中分配一个值,这个值仅仅是指向同一个对象的引用,和原对象指向的都是堆内存中的同一个对象。 对于函数,解释器创建了”调用栈“来记录函数的调用过程。...每调用一个函数,解释器就可以把该函数添加进调用栈,解释器会为被添加进来的函数创建一个栈帧(用来保存函数的局部变量以及执行语句)并立即执行。...如果正在执行的函数还调用了其他函数,新函数会继续被添加进入调用栈。函数执行完成,对应的栈帧立即被销毁。...但是经过标记清除之后的内存空间会生产很多不连续的碎片空间,这种不连续的碎片空间中,在遇到较大的对象时可能会由于空间不足而导致无法存储。

    92031

    前端优化:首屏加载速度的实践

    那么接下来就分享一个简单的示例,以使用JavaScript和Intersection Observer API实现图片懒加载的简单示例,具体的示例代码如下所示:函数,节流是在一定时间内只触发有限次数的函数,这两种技术都可以有效减少用户连续点击或输入导致的额外请求。...);在上面的示例代码中,定义了一个debounce函数,它接受一个需要防抖的函数和一个等待时间作为参数。...在防抖函数内部,使用setTimeout来延迟执行原函数,并在每次调用防抖函数时清除上一次的定时器,然后只有在最后一次调用防抖函数后等待指定的时间,才会执行原函数。...我个人觉得前端优化首屏加载速度需要从多个方面入手,借助通过采用多图片的懒加载、避免用户多次点击请求以及使用骨架屏等技术手段,可以有效提升网页的首屏加载速度提升用户体验,但是也需要注意在优化过程中保持代码的清晰和可维护性

    24841

    JavaScriptNode.js 有协程吗?

    而我们使用 Node.js 利用 Cluster 模块根据 CPU 核心数创建多进程解决的是并行问题,假设我有 4 CPU 每个 CPU 分别对应一个线程并行处理 A、B、C、D 不同的任务,线程之间互不抢占资源...需要注意,如果一个协程遇到了阻塞的 I/O 调用,这时会导致操作系统让线程阻塞,那么在这个线程上的其它协程也都会陷入阻塞。 一句话总结:协程共享数据,由程序控制完成上下文切换,语言层级的构造。...JavaScript 是一个单线程的语言,只能保持一个调用栈。...参考 coroutines-introduction 栈是一块连续的内存,能够从子函数产生的协程称为栈式,它们可以记住整个调用栈,这种也称为栈式协程。...下面示例 test1() 是生成器函数,但是 forEach 里面的匿名函数是一个普通的函数,就无法在内部使用 yield 关键字,运行时会抛出错误 “SyntaxError: Unexpected identifier

    4.1K30

    DateTime.LocalNow和FixedLocalNow,这俩函数到底有啥差别?| Power Query解惑

    所以,为了方便大家理解,我决定造个例子—— 首先,看DateTime.FixedLocalNow函数的解析,其中还有一句:“将不会随着连续调用而更改”。...所以,关键在于“连续调用”——这里面隐含2层意思: 1、连续,说明要有多次调用; 2、要在多次里体现不同的当前时间(LocalNow),那每次调用之间最好要有一定的间隔,否则系统内很快就全部运行完毕,可能就看不出差别...(), #duration(0,0,0,1) ) ) 显然,在多次调用的过程中,DateTime.FixedLocalNow()的结果是一样的。...而对于DateTime.LocalNow()的连续调用,每次的结果就不一样了: 通过这个例子,大家能明确知道这两个函数的确是存在差异的。...但就我目前所碰到的实际工作情况,或朋友们所提的问题来说,暂时还没见到过有对当前时间(LocalNow)进行连续调用的要求——所以,除非特殊需要,两个函数随便用哪一个都可以。

    81410

    JS 代码越来越难读了 ...

    大家好,我是 ConardLi。 今天来给大家介绍 JavaScript 代码的一个新运算符:管道运算符 |>。...对一个值执行连续操作 当我们在 JavaScript 中对一个值执行连续操作(例如函数调用)时,目前有两种基本方式: 将值作为参数传递给具体操作(如果有多个操作,则嵌套操作),例如:three(two(...在 2020 年 JS 状态调查中,“你认为 JavaScript 目前缺少什么?“ 问题中,希望拥有管道操作符 答案排行第四名。 看来大家当前对 JS 中连续操作的写法还是不太满意啊。...Hack 管道运算符 下面是一个 Hack 管道运算符 |> 的简单示例: 'ConardLi' |> console.log(%) // ConardLi 管道运算符 |> 的左侧是一个表达式,它被计算并成为特殊变量...这可能也是大家更倾向于 Hack pipe 的原因。 管道运算符的一些实际用例 嵌套函数调用的扁平写法 JavaScript 标准库创建的所有迭代器都有一个共同的原型。

    1.7K21

    React 新特性 Suspense 和 Hooks

    在一个 React 的应用中,应用的渲染/更新会触发一段连续时间的 JS 执行,这期间 JS 阻塞布局、动画等其他工作。...因为 Render Phase 是可以被中断的,同时因高优先级任务插入造成的中断会使得当次任务被完全终止放弃(后在合适时机重新执行),所以其中的生命周期函数可能会被多次调用,因此我们不应该在 Render...示例中 useState 就是一个 Hook,通过它,我们给一个函数组件添加了 state。...这些相互关联且需要对照修改的代码被拆分在不同地方,而那些互不相关的代码却在同一个方法中组合在一起,或者说每个生命周期函数都包含某个业务逻辑的一部分,每个业务逻辑又被分散在每个生命周期函数中。...我们通过一个简单示例看一下这两种方式,示例中我们需要共享的状态逻辑为:通过上文中用到的 ChatAPI,获取某个 friendId 的在线状态 isOnline。

    2.6K30

    JavaScript 学习-35.jQuery 基础语法与事件

    前言 jQuery 是一个轻量级的”写的少,做的多”的 JavaScript 库。...极大地简化了 JavaScript 编程 jQuery 库包含以下功能: HTML 元素选取 HTML 元素操作 CSS 操作 HTML 事件函数 JavaScript 特效和动画 HTML DOM 遍历和修改...入口函数: window.onload = function () { // 执行代码 } jQuery 入口函数与 JavaScript 入口函数的区别: jQuery 的入口函数是在 html...隐藏和显示 jQuery 提供了隐藏和显示元素的基本方法 hide() 隐藏元素 show() 显示元素 toggle() 切换显示和隐藏 示例 如果你点击“隐藏” 按钮,我将会消失...}) }); 但是通过id定位的元素,只会绑定第一个,因为一般id在页面上具有唯一性,不要重复,通过id查找的元素,只返回第一个 点我 <button

    2K10

    JavaScript 中的调节器:提高程序的性能

    我将以一个真实世界的类比开始,然后在 Web 上下文中描述调节器,最后提供有关如何实现节流的注释代码示例。在文章的结尾,有一个带有调节器示例的 Codepen,你可以与之交互以查看其工作原理。...它仅用于教学目的,并非是效率最高或代码行数最少的。 调节器是一个高阶函数,这是一个返回另一函数的函数(为清楚起见,此处命名为 throttledEventHandler)。...delay:你希望节流函数在多次执行 callback 之间等待的时间。...如果有一个 storedEvent,我们想立即处理它,这是则会递归地调用 throttledEventHandler。setTimeout 内部的递归调用使我们能够以恒定的速率处理事件。...throttleTimeout = null; // 如果我们有一个存储的事件,则递归调用此函数。 // 递归使我们能够在事件发生时连续运行。

    92200

    React 中的useState 和 setState 的执行机制

    这里的“异步”并不是说内部由异步代码实现,其实本身执行的过程和代码都是同步的,只是「合成事件」和「钩子函数」的调用顺序在更新之前,导致在合成事件和钩子函数中没法立马拿到更新后的值,形式了所谓的“异步”。...「批量更新优化」也是建立在“异步”(合成事件、钩子函数)之上的,在原生事件和setTimeout、Promise.resolve().then 中不会批量更新,在“异步”中如果对同一个值进行多次修改,批量更新策略会对其进行覆盖...所以,React 为了性能原因,对调用多次setState方法合并为一个来执行。当执行setState的时候,state中的数据并不会马上更新。 光怎么说肯定不容易理解,我们来通过几个案例来说明吧。...同步执行 ) } 当点击同步执行按钮时,只重新 render 了一次 当点击异步执行按钮时,render 了两次 「同步和异步情况下,连续执行两次同一个...我在 state 里面设置一个对象好不好?

    3.2K20

    浅习一波JavaScript高级程序设计(第4版)p7-生成器

    这是我参与「掘金日新计划 · 6 月更文挑战」的第13天,点击查看活动详情 ---- JavaScript 高级程序设计第 4 版(后简称高程4),相较于第 3 版,增加了 ES6 至 ES10 的全新内容...中文译版于 2020 年发售,妥妥的“新鲜出炉”,你要是问本瓜:当今学 JavaScript 哪家强,我只能说:红宝书第 4 版最在行。...,即 y = 10,返回 y iterator.next() // {done: true} 生成器函数的语法规则是: 调用一个生成器函数并不会马上执行它里面的语句,而是返回一个这个生成器的 迭代器...默认迭代器就像一个迭代器工厂,也就是一个函数,调用之后会产生一个实现 Iterator 接口的对象。...迭代器必须通过连续调用 next()方法才能连续取得值,这个方法返回一个 IteratorObject。这个对象包含一个 done 属性和一个 value 属性。

    23530

    【JS】336- 拆解 JavaScript 中的异步模式

    而这里的「另外一个函数」也有一个常见的名字,Hight order function 高阶函数。 需要澄清的一点是,Callback 并非都是异步执行的。...这个题目来自于我看过的一个网课[2] ,后续还会多次出现,使用不同的异步模式解决。...从同步的角度看,thunk 是一种函数,这种函数已经包含了所有你需要的值,你不需要传入任何参数,仅仅需要调用它,它就会将值返回给你。...这和上面提到的回调不同,普通的 callback 实际上是第三方直接调用我们的函数,这个第三方不一定是完全可信的,我们的回调函数可能会被调用,也可能不会调用,还可能会调用多次。...很长一段时间里,我都把 Async 函数当作是 JavaScript 中处理异步最完美的方案。

    81330
    领券