Home

事件循环:微任务与宏任务

事件循环:微任务与宏任务 JavaScript 的执行流,无论是浏览器还是 Node.js,都是基于事件循环。 理解事件循环能够让我们写出更可靠的高性能代码。 让我们先介绍一下事件循环的原理,然后再来看看实际应用。 事件循环(Event Loop) 事件循环的概念非常简单。它就是一个无止境的循环,JavaScript 引擎等待任务(tasks)出现,然后执行任务,执行完毕后继续等待任务出现。 JavaScript 引擎对事件循环的算法为: 当发现任务时: 执行任务,从最先进入队列的任务开始 等待其他任务出现,然后执行步骤 1。 当浏览网页时,就是以这种方式呈现。JavaScript 引擎在大部分时间都处于空闲状态,仅在被...

Read more

纯函数是什么?

纯函数就是一个函数,只不过具有一些特点,你可能平时开发中都有用到,只是没有意识到这是一个纯函数。 纯函数(Prue function)具有以下特点: 纯函数每一次调用时传入同样的参数,返回的都是同样的结果;它不会改变参数的值,也不会改变外部变量的值;它不会依赖于外部的变量,仅依赖于你传入的参数; 纯函数没有其他副作用(side effect) 如果你每次传入的参数一样,但是返回的结果不一样,则不是一个纯函数 Just show me the code: 这是一个纯函数: /* 它接受两个参数:一个数组和一个要添加的项 然后根据这两个参数,返回一个新的数组 它没有改变原来参数的值 每次调用时传递相同的值,返回的结果永远一样 ...

Read more

JavaScript 延迟脚本之 async 和 defer 的区别

avaScript延迟脚本之async和defer的区别 defer 和 async 都是<script>标签的属性,属于 HTML4 的规范,作用是延迟加载脚本和异步执行 JS 代码。 defer 属性 浏览器在解析 HTML 文档时,如果遇到有 defer 属性的<script>标签,会立即下载该文件,下载的同时不阻塞 HTML 的解析与渲染,一旦页面解析和渲染完毕,就会执行该文件。 在 HTML5 的规范中,规定了多个带有 defer 属性的<script>标签在执行时按照在页面中的先后顺序来执行,并且执行的时机是在页面的 DomContentLoaded() 事件之前。 但是在现实中,多个 defer 属性并不一定按照顺序执行,也不一...

Read more

JavaScript 之对象类型转换

目录 对象类型转换时的分类 对象转换时的步骤 Symbol.toprimitive toString和valueOf 必须返回一个基础类型 存在显示的 toString 方法 摘要 对象转换时先要确定转换的类型,这个类型在对象的[Symbol.toPrimitive]属性值-函数的参数中可以拿到,一共有三种: string number default string 以下两种情况会将确定对象的转换类型为 string: 使用alert(person) 将对象看做是一个对象的属性来取值时,例如family[person] number 以下两种情况会将确定对象的转换类型为 number: 使用一元数学操作符,...

Read more

JavaScript 之内存回收机制(译文)

JavaScript 的内存管理(垃圾回收机制) 在 JavaScript 中,内存管理是自动执行并且不可见的。我们创建原始数据类型,对象,函数…,都需要占用内存。 当有些变量不再需要的时候会发生什么呢?Javascript 引擎是怎么发现它并且清除它的呢? 可达性(Reachablity) 在内存管理中,主要的概念就是可达性。 简单来说,可达性就是指那些可以访问到的或者可以使用的数据。这些数据被存放在内存当中。 有一系列默认拥有可达性特点的值,它们无法被显示删除。 例如: 当前函数的参数和局部变量 嵌套的函数调用链中的其他函数的参数和变量 全局变量 (其他一些内在的值) 这些值被称之为根值(roots) ...

Read more

HTTP 和 HTTPS

HTTP(Hypertext Transfer Protocol)和 HTTPS(Hypertext Transfer Protocol Secure)是两种用于在计算机网络上传输数据的协议。它们的主要区别在于安全性: 安全性: HTTP: HTTP 是一种不加密的协议,意味着通过 HTTP 传输的数据在网络上是明文可见的。这使得数据容易受到窃听、篡改和其他安全风险的威胁。 HTTPS: HTTPS 通过使用 SSL(Secure Sockets Layer)或 TLS(Transport Layer Security)加密协议来保护传输的数据。这意味着通过 HTTPS 传输的数据在传输过程中是加密的,从而更难以被窃听和篡改。 ...

Read more

CSS 之层叠与继承

CSS 层叠(Cascading)指的是某个元素会根据样式规则的优先级来设置某个元素的外观。 层叠样式的优先级主要有三方面: 根据样式域判断,是用户代理样式(user agent stylesheet),还是我们自己写的样式;是否存在 !important 标识; 根据元素样式属性判断,是否是写在元素行内的 style 属性中; 根据选择器判断。 用户代理样式是什么? 基本上所有浏览器都有默认的样式,例如 <h1>-<h6>,<p> 标签都有默认的上边距和下边距,这是由浏览器默认设置的,所以叫用户代理样式。 如果一个元素身上有很多相同的样式规则,那么到底该应用哪一条呢? 首先,浏览器会先判断当前样式是用户代理样式还是我们自...

Read more

浏览器的渲染流程(译)

浏览器的渲染流程分为三步:布局(Layout)、绘制(Paint)、混合(Composite)。 当浏览器计算出哪条样式是作用在哪个元素身上以后,就需要将样式转换成 px 并显示在屏幕上。这个过程就是渲染(rendering),整个过程可以分为三步:布局,绘制,混合。 布局 渲染的第一步是布局,浏览器计算每个元素要在文档中占据的空间。因为有默认的文档流,元素的大小和位置会影响到页面中其他元素的大小和位置。布局就是将他们计算出来。 任何时候改变一个元素的宽高或者调整它的定位偏移值(Left / top 等),浏览器就会重新计算这个元素的布局。同样的,如果插入一个元素到文档流中,或者通过 JS 从文档流中移除一个元素,浏览器也会重新计算该元素的布局。当一个元素的布局发生改变,浏...

Read more