前端基础练习题第33天 答案及解析

本篇文章是前端基础练习题第三十三天的答案及解析部分,纯题目部分请移步前端基础练习题 第33天

正文

1.JS中垃圾回收机制存在的必要性有哪些?

由于字符串、对象和数组没有固定大小,当它们的大小已知时,才能对它们进行动态的存储分配。而像这样动态分配的内存,最终都要释放这些内存以便它们能够被再用。否则,JS解释器将会消耗完系统中可用的内存,造成系统崩溃。

垃圾回收机制主要是进行内存回收,防止内存被占用完。

2.试简述一下js中的垃圾回收方法?

现在各大浏览器通常采用的垃圾回收方法有两种,即标记清除法和引用计数法。

  1. 标记清除法,这也是JS中最常用的垃圾回收机制。通常将变量标记为“进入环境”和“离开环境”,对于标记值为“离开环境”的变量,垃圾收集器就销毁其值并释放内存空间。
  2. 引用计数法,其是跟踪记录每个值被引用的次数。当引用次数为0时,就可将其所占内存空间进行回收。但是当遇到循环引用的时候,却并不会被垃圾回收器回收,而造成内存泄漏。

重点掌握标记清除法即可。

3.试简述JS引擎的执行过程。

JS引擎执行过程主要分为三个阶段,分别是语法分析、预编译和执行阶段。

  1. 语法分析阶段:对加载完成的代码块进行语法检验,语法正确则进入预编译阶段,否则停止代码执行,并抛出语法错误(SyntaxError)
  2. 预编译阶段:在该阶段中,创建变量对象,分配变量和函数声明的内存空间,确定作用域链以及this指向
  3. 执行阶段:在该阶段,从上至下执行代码,由于js是单线程的,故将通过事件循环机制执行异步代码以避免代码执行阻塞

4.如何解决异步回调地狱问题?

异步回调地狱是指代码横向增长,如在回调之中嵌套多层回调,这会使得代码复杂,逻辑混乱且耦合性强,不利于后期维护。解决方法有:

  1. Promisethen方法,进行链式调用
  2. 使用asyncawait
  3. 使用Generator协程

Promise应该是目前最常用的异步方式,其可以使用.then()进行链式调用。

5.jQuery动态生成的元素如何绑定事件?

对于动态生成(如append()添加、ajax动态加载)的元素,直接绑定事件操作(如click事件)是不起作用的。此时应使用事件委托机制,将事件绑定在已存在于DOM中的元素上。通过jQueryon()方法可以实现。on()方法添加的事件处理程序适用于当前及未来的元素。示例如下所示:

1
2
3
$('.select').on('click', '.select-item', function() {
$(this).addClass('active');
});

这段代码可理解为给.select下的.select-item(包括现在及未来的)绑定click事件。

6.mouseovermouseenter事件有何区别?

当鼠标移入元素或其子元素都会触发mouseover事件,即其有一个冒泡的过程;当鼠标移入元素本身时会触发mouseenter事件,该事件只触发一次,即不会引起事件冒泡。

mouseenter没有冒泡的过程,而mouseover在容器区域内会多次触发,有冒泡的过程。

7.输入出生日期(YYYY-MM-DD格式),判断年龄是否大于18岁,大于18岁返回true,否则返回false

参考代码如下所示:

1
2
3
4
5
6
7
function isAudit(age) {
let t1 = Date.parse(age);
let t2 = Date.now();
let yearDiff = (t2 - t1) / (365 * 24 * 60 * 60 * 1000);
return yearDiff > 18;
}
isAudit('1996-05-15');

代码中主要是将输入的时间转换为时间戳,然后计算时间戳差,并把时间戳差转化为年,判断其是否大于18即可。这只是其中一种实现方式,应该也是较为简便的一种方式。

说明

  1. 题目中出现的JS指的是采用ECMAScript 2015及之后标准的JavaScript

  2. 答案中,若有错误和需完善的地方,可在下方留言反馈哈~~

  3. 查看纯习题版,请点击前端基础练习题 第33天

--本文结束 感谢阅读--
创作十分不易,原创更应鼓励