专业编程教程与实战项目分享平台

网站首页 > 技术文章 正文

悠然晨光里!2 道 JS 面试题慢品,开启高效学习日

ins518 2025-05-15 18:19:51 技术文章 3 ℃ 0 评论

在晨光微熹的清晨,泡一杯醇香的咖啡,坐在窗边,让我们以一种舒缓、平和的节奏,来拆解两道 JavaScript 高频面试题。就像在宁静的早晨漫步,不疾不徐地探索前端知识的美好,在缓解压力的同时,悄悄为自己的技能库添砖加瓦。

理解 JavaScript 中的闭包

面试官常会问:“请谈谈你对闭包的理解,并举例说明它的应用场景。” 闭包乍一听有些抽象,其实它就像一个私人的 “秘密花园”,只有特定的 “钥匙” 才能打开,里面的 “花草”(变量和函数)被好好地保护起来,不被外界随意打扰。

// 定义一个外层函数,它返回一个内部函数
function outerFunction() {
// 声明一个局部变量,这个变量会被闭包“记住”
let privateVariable = 0;
// 返回一个内部函数,这个内部函数可以访问外层函数的局部变量
return function innerFunction() {
privateVariable++;
return privateVariable;
};
}
// 调用外层函数,得到一个内部函数的实例,此时闭包已经形成
const counter = outerFunction();
// 每次调用counter函数,都会访问并修改被闭包保护的privateVariable
console.log(counter()); // 输出1
console.log(counter()); // 输出2

在这段代码中,outerFunction返回的innerFunction就是一个闭包。innerFunction能够记住并访问outerFunction作用域内的privateVariable,即使outerFunction已经执行完毕。在实际开发中,闭包可以用来实现私有变量,保护数据不被随意修改;还能用于函数防抖和节流,优化页面性能,比如控制按钮在短时间内只能点击一次。

JavaScript 中的事件循环机制

“请解释一下 JavaScript 的事件循环是什么,它是如何处理同步和异步任务的?” 这听起来像是个复杂的问题,但把它想象成一场有条不紊的 “任务接力赛” 就容易理解多了。JavaScript 是单线程的,就像只有一个运动员在跑步,同一时间只能处理一个任务。

console.log('1. 同步任务开始');
setTimeout(() => {
console.log('4. 定时器回调');
}, 0);
Promise.resolve()
.then(() => {
console.log('3. Promise回调');
});
console.log('2. 同步任务结束');

在这场 “接力赛” 中,同步任务(主线程上的任务)就像运动员一开始要跑的固定路程,会按顺序依次执行。而异步任务,比如setTimeout(宏任务)和Promise(微任务),则像是运动员跑到特定地点后要完成的额外任务。当主线程上的同步任务执行完后,会优先处理微任务队列里的任务,比如Promise的then回调,处理完微任务后,才会去处理宏任务队列里的任务,比如setTimeout的回调。所以上面代码的执行顺序是:同步任务开始 → 同步任务结束 → Promise 回调 → 定时器回调 。

面试应答模板

闭包问题回答

“闭包其实就是函数和它能够访问的外部变量的一个组合。简单来说,当一个内部函数引用了外层函数的变量,并且这个内部函数被返回或者被保存下来,就形成了闭包。就好比一个小盒子,把函数和它需要的变量装在一起,别人不能随便动里面的东西。在实际项目里,闭包可以用来实现私有变量,像有些数据不想被外部随意修改,就可以通过闭包把它保护起来;还有在优化页面性能时,比如按钮的防抖和节流功能,也会用到闭包,防止短时间内多次触发函数,造成性能问题。”

事件循环问题回答

“JavaScript 的事件循环就像一场有序的任务接力。因为 JavaScript 是单线程的,同一时间只能做一件事,所以任务得分成同步和异步来处理。同步任务就像运动员一开始的固定跑步路线,会按顺序一个接一个执行;异步任务又分宏任务和微任务,像setTimeout就是宏任务,Promise的then回调是微任务。当同步任务都执行完了,会先把微任务队列里的任务处理完,再去处理宏任务队列里的任务,就这样循环往复。理解事件循环对写高效的代码很有帮助,可以避免因为异步任务执行顺序混乱,导致程序出现奇怪的问题。”

在宁静的上午时光,完成这样一次知识的小旅行,是不是感觉既充实又放松?关于这两道题,你还有哪些疑问,或者有不同的理解,欢迎在评论区分享。也别忘了点赞关注,明天清晨,我们继续相约,解锁更多有趣的前端面试题!

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表