前端面试 - JS总结(3)- 异步,读完我这份《前端开发核心源码精编解析》面试至少多要3K

为什么不是真正的AJAX

  • 首先,ajaxjsonp在调用方式上虽然长得差不多(目的一样,都是请求一个url,然后把服务器返回的数据进行处理),但是ajaxjsonp本质上是不同的东西;

  • 哪里不同?核心不同!ajax的核心是通过XmlHttpRequest获取非本页内容,而jsonp的核心则是动态添加<script>标签来调用服务器提供的js脚本;

  • 此外,需要注意的是,ajaxjsonp的区别不在于是否跨域。因为ajax通过服务端代理一样可以实现跨域,jsonp本身也不排斥同域的数据的获取。还有就是jsonp是一种方式或者说是非强制协议,如同ajax一样,它也不一定非要jsonp格式来传递数据;

  • jsonp只支持get请求,ajax支持getpost请求.

10. 常用定时器函数


常见的定时器函数有 setTimeout、setInterval、

(1)setTimeout

在指定的毫秒数后,将定时任务处理的函数添加到执行队列的队尾。setTimeout只在指定时间后执行一次.  setTimeout用于延迟执行某方法或功能

(2)setInterval

按照指定的周期(以毫秒数计时),将定时任务处理函requestAnimationFrame。数添加到执行队列的队尾。setInterval以指定时间为周期循环执行。setInterval则一般用于刷新表单,对于一些表单的假实时指定时间刷新同步

(3)requestAnimationFrame

HTML5 新增加的 API,类似于 setTimeout 定时器。window 对象的一个方法, window.requestAnimationFrame。使用 requestAnimationFrame 执行动画,最大优势是能保证回调函数在屏幕每一次刷 新间隔中只被执行一次,这样就不会引起丢帧,动画也就不会卡顿。(setTimeout 通过设置一个间隔时间不断改变图像,达到动画效果。该方法在一些低端机 上会出现卡顿、抖动现象。参考链接:https://blog.youkuaiyun.com/weixin_40851188/article/details/89669416

二、性能优化

==========

11. 如何入手性能优化


(1)加载更快

减少资源体积:压缩代码

减少访问次数:合并代码,SSR服务器端渲染,缓存

使用更快的网络:CDN

(2)渲染更快/流畅

CSS放在head,JS放在body最下面

尽早开始执行JS,用DOMContentLoaded触发

懒加载(图片懒加载,上滑加更多)

对DOM查询进行缓存

频繁DOM操作,合并到一起插入DOM结构

节流throttle和防抖debounce

12. js 延迟加载的方式有哪些?


js 的加载、解析和执行会阻塞页面的渲染过程,因此我们希望 js 脚本能够尽可能的延迟加载,提高页面的渲染速度。

  1. 将 js 脚本放在文档的底部,来使 js 脚本尽可能的在最后来加载执行。

  2. 给 js 脚本添加 defer属性,这个属性会让脚本的加载与文档的解析同步解析,然后在文档解析完成后再执行这个脚本文件,这样的话就能使页面的渲染不被阻塞。多个设置了 defer 属性的脚本按规范来说最后是顺序执行的,但是在一些浏览器中可能不是这样。

  3. 给 js 脚本添加 async属性,这个属性会使脚本异步加载,不会阻塞页面的解析过程,但是当脚本加载完成后立即执行 js脚本,这个时候如果文档没有解析完成的话同样会阻塞。多个 async 属性的脚本的执行顺序是不可预测的,一般不会按照代码的顺序依次执行。

  4. 动态创建 DOM 标签的方式,我们可以对文档的加载事件进行监听,当文档加载完成后再动态的创建 script 标签来引入 js 脚本。

13. 在浏览器中输入URL到整个页面显示


(1)DNS解析

(2)TCP三次握手

(3)浏览器向服务器发送http请求  一旦建立了TCP链接,web浏览器就会向web服务器发送请求命令。

(4)浏览器发送请求头信息  浏览器发送其请求命令之后,还要以头信息的形式想web服务器发送一些别的信息,之后浏览器发送了一空白行开通知服务器,它已经结束了该头信息的发送。

(5)服务器处理请求  服务器收到http请求之后,确定用相应的一眼来处理请求。读取参数并进行逻辑操作后,生成指定的数据。

(6)服务器做出响应  客户端向服务器发送请求后,服务端向客户端做出应答。

(7)服务器发送应答头信息   正如客户端会随同请求发送关于自身的信息一样,服务器也会随同应答向用户发送关于它自己的数据以及被请求的文档。

(8)服务器发送数据    web服务器向浏览器发送信息后,它会发送一个空白行来表示头信息的发送到此结束。接着,它会以Content-Type应答头信息所描述的格式发送用户所请求的实际数据。

(9)TCP关闭(四次挥手)

一般情况下,一旦web服务器向浏览器发送了请求数据,它就要关闭tcp链接。如果浏览器或服务器在其头信息加入了Connection:keep-alive,则会保持长连接状态,也就是TCP链接在发送后仍保持打开状态,浏览器可以继续通过仙童的链接发送请求。

14. DNS解析过程


DNS( Domain Name System)是“域名系统”的英文缩写,是一种组织成域层次结构的计算机和网络服务命名系统,它用于TCP/IP网络,它所提供的服务是用来将主机名和域名转换为IP地址的工作。DNS是应用层协议,事实上他是为其他应用层协议工作的,包括不限于HTTP和SMTP以及FTP,用于将用户提供的主机名解析为ip地址。

关于DNS的获取流程具体过程如下:

(1)  用户主机上运行着DNS的客户端,就是我们的PC机或者手机客户端运行着DNS客户端了

(2)  浏览器将接收到的url中抽取出域名字段,就是访问的主机名, 并将这个主机名传送给DNS应用的客户端

(3)  DNS客户机端向DNS服务器端发送一份查询报文,报文中包含着要访问的主机名字段(中间包括一些列缓存查询以及分布式DNS集群的工作)

(4)  该DNS客户机最终会收到一份回答报文,其中包含有该主机名对应的IP地址

(5)  一旦该浏览器收到来自DNS的IP地址,就可以向该IP地址定位的HTTP服务器发起TCP连接

15. 回流和重回


影响页面渲染速度主要有:reflow(回流)和repaint(重绘)

**reflow(回流)当浏览器发现某个部分发生了点变化影响了布局,需要倒回去重新渲染, 该过程称为reflow(回流)。**reflow 几乎是无法避免的。现在界面上流行的一些效果,比如树状目录的折叠、展开(实质上是元素的显 示与隐藏)等,都将引起浏览器的 reflow。鼠标滑过、点击……只要这些行为引起了页面上某些元素的占位面积、定位方式、边距等属性的变化,都会引起它内部、周围甚至整个页面的重新渲 染。通常我们都无法预估浏览器到底会 reflow 哪一部分的代码,它们都彼此相互影响着。

repaint(重绘): 如果只是改变某个元素的背景色、文 字颜色、边框颜色等等不影响它周围或内部布局的属性,将只会引起浏览器 repaint(重绘)。    reflow是不可避免的,只能将reflow对性能的影响减到最小。

repaint 的速度明显快于 reflow. reflow(回流)是导致DOM脚本执行低效的关键因素之一。页面上任何一个结点触发reflow,都会导致它的子结点及祖先结点重新渲染。

**导致reflow发生:**改变窗囗大小,设置style属性,计算offsetWidth和offsetHeight,脚本操作DOM,操作class属性,激活伪类,如:hover (IE里是一个兄弟结点的伪类被激活),内容的改变,如用户在输入框中敲字,添加/删除样式表,改变文字大小

如何避免:

  1. 尽可能限制reflow的影响范围。需要改变元素的样式,不要通过父级元素影响子元素。最好直接加在子元素上。

  2. 通过设置style属性改变结点样式的话,每设置一次都会导致一次reflow。所以最好通过设置class的方式。

参考链接:https://www.cnblogs.com/Peng2014/p/4687218.html

16. 防抖与节流


函数防抖 是指在事件被触发 n 秒后再执行回调,如果在这 n 秒内事件又被触发,则重新计时。这可以使用在一些点击请求的事件上,避免因为用户的多次点击向后端发送多次请求。

函数节流 是指规定一个单位时间,在这个单位时间内,只能有一次触发事件的回调函数执行,如果在同一个单位时间内某事件被触发多次,只有一次能生效。节流可以使用在 scroll 函数的事件监听上,通过事件节流来降低事件调用的频率。

三、错误处理

==========

17. try - catch - finally


(1)try种没有发生异常,没有走catch,执行顺序是 try=>finally=>return(try);

(2)try发生异常,没有正常返回,进入catch方法块:try=>catch=>finally=>return(catch);

(3)finally方法中修改try或catch中的变量,返回结果不会被改变。也就是如果finally是在return之后执行的那么他会把返回结果先保存起来,然后不管finally代码执行了什么,都不会影响到返回结果,等finally执行完成在返回结果。

(4)finally也不是必须的。如果catch没有return 就会返回底部return方法。这是我们的常识。

(5)不写catch。try发生了异常,finally始终执行,然后异常被调用方法内的catch捕获执行顺序:try=>finally=>catch(主方法)

(6)throw 用于抛出异常,在catch中捕获异常。

  • 不管try有没有出错finally方法块都会被执行。【快记笔记,知识点。】

  • 就算try和catch方法都有return,finally都会执行;

  • 只要try或者catch return返回,try catch 之外的return都无效;

  • 不能在finally中写return 否则会报错。 不可以写重复多个try 但是可以多个catch

参考链接:https://www.cnblogs.com/yanbigfeg/p/9295541.html

四、其他

========

18. 模块化开发的理解?


一个模块是实现一个特定功能的一组方法。在最开始的时候,js 只实现一些简单的功能,所以并没有模块的概念 ,但随着程序越来越复杂,代码的模块化开发变得越来越重要。

由于函数具有独立作用域的特点,最原始的写法是使用函数来作为模块,几个函数作为一个模块,但是这种方式容易造成全局变量的污 染,并且模块间没有联系。

后面提出了对象写法,通过将函数作为一个对象的方法来实现,这样解决了直接使用函数作为模块的一些缺点,但是这种办法会暴露所 有的所有的模块成员,外部代码可以修改内部属性的值。

现在最常用的是立即执行函数的写法,通过利用闭包来实现模块私有作用域的建立,同时不会对全局作用域造成污染。

19. js 的几种模块规范?


js 中现在比较成熟的有四种模块加载方案:

  • 第一种是 CommonJS 方案,它通过 require 来引入模块,通过 module.exports 定义模块的输出接口。这种模块加载方案是服务器端的解决方案,它是以同步的方式来引入模块的,因为在服务端文件都存储在本地磁盘,所以读取非常快,所以以同步的方式加载没有问题。但如果是在浏览器端,由于模块的加载是使用网络请求,因此使用异步加载的方式更加合适。

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注前端)
img

性能优化

1.webpack打包文件体积过大?(最终打包为一个js文件)

2.如何优化webpack构建的性能

3.移动端的性能优化

4.Vue的SPA 如何优化加载速度

5.移动端300ms延迟

6.页面的重构

所有的知识点都有详细的解答,我整理成了280页PDF《前端校招面试真题精编解析》。

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
img

Z28yMzM=,size_16,color_FFFFFF,t_70)

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-5983myfj-1712556398512)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值