网站首页 > 技术文章 正文
在晨光微熹的清晨,泡一杯醇香的咖啡,坐在窗边,让我们以一种舒缓、平和的节奏,来拆解两道 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回调是微任务。当同步任务都执行完了,会先把微任务队列里的任务处理完,再去处理宏任务队列里的任务,就这样循环往复。理解事件循环对写高效的代码很有帮助,可以避免因为异步任务执行顺序混乱,导致程序出现奇怪的问题。”
在宁静的上午时光,完成这样一次知识的小旅行,是不是感觉既充实又放松?关于这两道题,你还有哪些疑问,或者有不同的理解,欢迎在评论区分享。也别忘了点赞关注,明天清晨,我们继续相约,解锁更多有趣的前端面试题!
猜你喜欢
- 2025-05-15 面试必问!前端自动检测代码更新大揭秘
- 2025-05-15 疲惫夜晚充电!1 道 JS 异步手写题攻克面试关键考点
- 2025-05-15 宁静清晨!两道 CSS 面试题,助你从容应对职场挑战
- 2025-05-15 惬意晨光中!2 道 JS 面试题漫谈,开启知识小旅程
- 2025-05-15 前端面试被问「你在未来 5 年的职业目标是什么」
- 2025-05-15 焦虑退散!3 道 JS 面试题详解,轻松吃透核心考点
- 2025-05-15 焦虑求职季!3 大 JS 高频题解析,助你面试稳拿 offer
- 2025-05-15 疲惫下班别愁!1 道 TypeScript 面试题助你充电避坑
- 2025-05-15 懵圈!面试官追问 HTML 空元素细节,3 分钟吃透核心考点
- 2025-05-15 [抓狂瞬间] 5 大差异 + 布局绝招!前端元素面试通关秘籍
你 发表评论:
欢迎- 最近发表
-
- 宇宙厂:深入聊聊 CJS 和 ESM 模块化三点核心差异?
- #前端高手进阶#一起薅羊毛~
- 前端基础进阶(十):深入详解函数的柯里化
- 2025 年 Object 和 Map 如何选择?
- 为何说 postMessage 才是真正的 setTimeout(0)?
- 为什么高手写 JS 总是又快又好?这10个技巧你要知道
- 2025 年 Deno 终于官宣 pnpm 和 Yarn 可使用 JSR?
- 宇宙厂:为什么前端要了解 Interaction to Next Paint (INP)
- Node.js 原生支持 TypeScript?开发者需要了解的一切
- 请务必用 postTask/isInputPending 释放JS主线程!
- 标签列表
-
- 前端设计模式 (75)
- 前端性能优化 (51)
- 前端模板 (66)
- 前端跨域 (52)
- 前端缓存 (63)
- 前端react (48)
- 前端md5加密 (49)
- 前端路由 (55)
- 前端数组 (65)
- 前端定时器 (47)
- 前端接口 (46)
- Oracle RAC (73)
- oracle恢复 (76)
- oracle 删除表 (48)
- oracle 用户名 (74)
- oracle 工具 (55)
- oracle 内存 (50)
- oracle 导出表 (57)
- oracle约束 (46)
- oracle 中文 (51)
- oracle链接 (47)
- oracle的函数 (57)
- mac oracle (47)
- 前端调试 (52)
- 前端登录页面 (48)
本文暂时没有评论,来添加一个吧(●'◡'●)