如何通过JavaScript面试:核心问题
JavaScript开发者面试(尤其是专注于Node.js的岗位)不仅仅是语法检查。雇主希望看到应聘者对异步机制、作用域以及事件循环工作原理的深入理解。在本文中,我们整理了面试中实际会问到的高频问题,并附上代码示例和解析。
1. 闭包——函数式JS的基石
问题:"什么是闭包?它在Node.js中如何工作?"
闭包是一个能“记住”其词法环境的函数,即使外部函数已执行完毕。这是JavaScript中实现数据封装的关键机制。
function createCounter() { let count = 0; return function() { count++; return count; };}
const counter = createCounter();console.log(counter()); // 1console.log(counter()); // 2面试官考察点:闭包是Node.js中模块、函数工厂和事件处理程序的基础。不理解闭包就无法处理异步回调。
2. 事件循环与异步机制(Async/Await、Promise)
问题:"请解释事件循环的工作原理。这段代码会输出什么?"
console.log('1');
setTimeout(() => console.log('2'), 0);
Promise.resolve().then(() => console.log('3'));
console.log('4');答案:1, 4, 3, 2。先执行同步代码,然后是微任务(Promise.then),最后是宏任务(setTimeout)。
事件循环是一种机制,允许Node.js在单线程环境下执行非阻塞操作。它包含多个阶段:
- 定时器阶段——执行setTimeout/setInterval的回调
- I/O回调阶段——处理已完成的输入/输出操作
- 轮询阶段——获取新的I/O事件
- 检查阶段——执行setImmediate()
- 关闭回调阶段——关闭连接
技巧:在面试中,展示你对process.nextTick()和setImmediate()区别的理解。nextTick在事件循环的下一个阶段之前执行,而setImmediate在检查阶段执行。
3. 执行上下文(this)与箭头函数
问题:"在不同情况下this的值是什么?如何改变执行上下文?"
this的值取决于函数的调用方式,而非声明位置。在Node.js(严格模式)的普通函数中,this为undefined,而在浏览器中则为window。
const obj = { name: 'Node.js', regularFunc: function() { console.log(this.name); }, arrowFunc: () => { console.log(this.name); }};
obj.regularFunc(); // 'Node.js'obj.arrowFunc(); // undefined(this取自外部上下文)如何管理上下文:
call(thisArg, arg1, arg2)——使用指定的this和参数调用函数apply(thisArg, [args])——类似,但以数组形式传递参数bind(thisArg)——创建绑定this的新函数- 箭头函数——没有自己的this,使用词法上下文
4. 原型与继承(原型链)
问题:"JavaScript中的原型继承如何工作?与类的区别是什么?"
JavaScript使用原型继承:每个对象都有一个内部引用[[Prototype]](可通过__proto__或Object.getPrototypeOf()访问)。
function Animal(name) { this.name = name;}
Animal