晨光微醺时!2 道 JS 核心题漫谈,解锁面试小技巧

当清晨第一缕阳光爬上窗台,泡一杯香气四溢的花茶,在这静谧又惬意的时光里,让我们抛开面试的紧张,像和老友聊天一样,聊聊两道 JavaScript 高频面试题。没有晦涩的术语,没有枯燥的讲解,只有轻松愉悦的知识分享,为你今天的学习注入满满元气!

第一题:JavaScript 中的作用域与作用域链

面试官常问:“说一说 JavaScript 中作用域和作用域链的概念,它们是如何影响变量查找的?” 别被这些听起来高深的名词吓到,把它们想象成一个个 “小房间” 和连接这些 “小房间” 的 “通道” 就好理解了。作用域就是变量的 “专属房间”,而作用域链就是查找变量时要走的 “路线图”。

// 全局作用域
let globalVariable = '我是全局变量';
function outerFunction() {
// 函数作用域
let outerVariable = '我是外层函数变量';
function innerFunction() {
// 内层函数作用域
let innerVariable = '我是内层函数变量';
console.log(globalVariable); // 可以访问全局变量
console.log(outerVariable); // 可以访问外层函数变量
console.log(innerVariable); // 可以访问自身作用域的变量
}
innerFunction();
// console.log(innerVariable); // 报错,innerVariable在innerFunction作用域之外无法访问
}
outerFunction();
// console.log(outerVariable); // 报错,outerVariable在外层函数作用域之外无法访问

在这段代码中,globalVariable位于全局作用域,就像放在公共客厅的物品,谁都能看见;outerVariable在outerFunction的函数作用域内,相当于放在某个房间里的私人物品,只有这个房间的 “居民”(函数内部)能使用;innerVariable则在更内层的innerFunction作用域里。当查找变量时,JavaScript 会先在当前作用域找,如果找不到,就沿着作用域链往上一层一层找,直到全局作用域,这就是作用域链的工作方式。

第二题:JavaScript 中的 Promise 与 async/await

“请谈谈你对 Promise 和 async/await 的理解,它们在异步编程中有什么优势?” 这就好比给异步任务安排了一位 “靠谱管家”。Promise 能让异步操作变得更有条理,而 async/await 则是 Promise 的 “升级版”,让代码看起来更像是同步执行,简单又清晰。

// Promise示例
function fetchData() {
return new Promise((resolve, reject) => {
setTimeout(() => {
const success = true;
if (success) {
resolve('数据获取成功'); // 异步操作成功,返回结果
} else {
reject('数据获取失败'); // 异步操作失败,返回错误信息
}
}, 1000);
});
}
fetchData()
.then((result) => {
console.log(result); // 输出'数据获取成功'
})
.catch((error) => {
console.error(error); // 如果失败,输出错误信息
});
// async/await示例
async function handleData() {
try {
const result = await fetchData(); // 等待Promise返回结果,代码暂停在此处
console.log(result); // 输出'数据获取成功'
} catch (error) {
console.error(error); // 如果失败,捕获错误信息
}
}
handleData();

Promise 通过then和catch分别处理成功和失败的情况,避免了复杂的回调嵌套(回调地狱)。而 async/await 基于 Promise,用更简洁的语法实现异步操作,await关键字让异步代码看起来像同步代码一样顺序执行,大大提高了代码的可读性和可维护性,在处理多个异步任务时优势尤为明显。

面试回答方法

作用域与作用域链问题回答

“JavaScript 里的作用域,就是变量的‘活动范围’。它分为全局作用域和函数作用域,全局作用域里的变量,整个程序都能访问;函数作用域里的变量,只有在这个函数内部能用。作用域链呢,是变量查找的‘路径’。当 JavaScript 要找一个变量时,会先在当前作用域里找,如果找不到,就去上一层作用域找,一直找到全局作用域。比如函数里的变量,会先在函数内部找,找不到就去外层函数或者全局作用域找。理解作用域和作用域链很重要,能帮我们避免变量冲突,写出更规范的代码。”

Promise 与 async/await 问题回答

“Promise 是 JavaScript 处理异步操作的一个对象,它有三种状态:进行中、已成功和已失败。我们可以用then方法处理成功的结果,用catch方法处理失败的情况,这样就把复杂的异步回调变得有条理,不会出现‘回调地狱’。async/await 是 Promise 的‘语法糖’,用起来更简单。async函数返回一个 Promise,await关键字可以暂停函数执行,等 Promise 有结果了再继续,代码看起来就像同步的一样,特别直观。在实际开发中,比如处理网络请求、读取文件这些异步操作,用 Promise 和 async/await 能让代码更好写、更好维护。”

在这美好的清晨时光里,我们一起收获了新知识。对于这两道面试题,你有什么不同的见解或疑问吗?欢迎在评论区留言讨论!觉得文章对你有帮助,别忘了点赞关注,明天清晨,我们继续相约,探索更多有趣的前端面试知识!

原文链接:,转发请注明来源!