我上一篇文章刚聊完游戏公司前端的技能树取舍,就有好几个读者来问莉莉丝的一面情况。说实话,莉莉丝这种自研游戏项目偏重的公司,前端一面和普通互联网公司的考察点既有重合,又有明显的业务侧重。我在整理面经时发现,很多候选人不是不会做题,而是不知道这道八股文题背后面试官到底在验证什么能力,导致答得浅、答得散、答不到点上。这篇就结合莉莉丝2026年2月5日的前端一面真实面试题,做一次完整拆解,把每道题的考点、原理、答题话术和加分细节全部展开。不管你是正在准备春招的应届生,还是想跳槽进游戏行业的前端工程师,这篇都能用得上。
1. 莉莉丝前端一面:面试流程与考察维度拆解
1.1 莉莉丝一面的整体节奏与游戏公司特征
莉莉丝的一面通常维持在50到60分钟,前20分钟会围绕简历项目和实习经历展开追问,中间30分钟是密集的八股文基础考察,最后5到10分钟留给候选人反问。这里有个很明显的信号:莉莉丝一面并不期待你直接上手写复杂逻辑,而是用高密度的基础题目快速验证你的技术下限。因为游戏公司前端团队规模通常比电商、内容平台类公司小,业务上要承接官网、活动页、玩家社区、中台系统、可视化报表等多个方向,一个人可能要同时对接多个项目,基础不牢就意味着后续带人成本极高。
游戏公司前端一面还有个特点:很关注“性能敏感度”。游戏业务的活动页和大促页流量波动极大,一个运营活动上线前要经过多轮压测,首屏时间、资源体积、接口并发都是硬指标。所以面试题里只要涉及渲染、加载、缓存、打包,面试官都会多追问一层为什么,而不是满足于你背出定义。
1.2 一面考察的四大能力坐标
从我整理的面经样本来看,莉莉丝一面基本围绕四个能力坐标展开:JavaScript语言功底、浏览器运行机制、前端框架原理、工程化与安全基础。这四块对应的是前端工程师日常工作中最常接触、也最容易出问题的深水区。
JavaScript考察聚焦闭包、原型链、事件循环、this指向、异步编程,这些是手写题和输出顺序题的常客;浏览器运行机制考察缓存、渲染流程、从输入URL到页面展示的完整链路;框架考察React Hooks的渲染逻辑、setState机制、组件通信、性能优化手段;工程化与安全考察webpack/Vite区别、XSS和CSRF防御、常见构建优化策略。整个一面下来几乎不碰具体业务,而是看你在脱离业务的前提下,能不能把技术原理讲清楚。
这里我说一句实在话,很多候选人觉得八股文面试是“背题大会”,但从面试官视角看,八股文其实是成本最低的能力探测工具。一道闭包输出顺序题,能同时测出你对作用域链、变量提升、定时器机制、事件循环的理解深度。一道XSS问答题,能看出你有没有真实处理过用户输入、有没有在项目里写过防御逻辑。所以别把八股文当负担,它是展示思维方式的舞台。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. JavaScript地基:必考八股的深度答法
2.1 闭包与原型链:摆脱背书腔的正确姿势
先看一道莉莉丝一面大概率会出现的手写题:
javascript复制for (var i = 0; i < 5; i++) {
setTimeout(() => {
console.log(i);
}, 1000);
}
说真的,这道题已经烂大街了,但面经反馈中依然有一半候选人只能答出“输出5个5”,却解释不清为什么。面试官接着抛出的经典追问是:怎么改成输出0、1、2、3、4?请至少说出三种方案。
第一种是var改let,这个基本都能答上;第二种是用闭包包裹一层立即执行函数,把每次的i作为参数传入;第三种是使用bind绑定当前值,setTimeout回调绑定参数;第四种是配合Promise和async/await让异步执行顺序可控。到这里,面试官其实已经在验证你对闭包的理解是否到位了。真正能拉开差距的是面试官继续追问:let方案为什么能行?let在底层做了什么?
这里要答到关键点:let声明的变量在每次循环迭代中都会创建一个新的词法环境,简单说就是每次循环的i都是独立绑定,闭包捕获的是当次迭代的绑定值;而var只存在一个函数级作用域,循环结束后统一访问的是同一个变量对象。这个区别要结合作用域链来解释,不能只停留在“let有块级作用域”这层。
接着面试官可能顺势考原型链。我见过的一道莉莉丝真题是:
javascript复制function Foo() {}
Foo.prototype.getName = function() { return 'foo' };
const foo = new Foo();
console.log(foo.getName()); // ?
console.log(foo.hasOwnProperty('getName')); // ?
console.log(foo.constructor === Foo); // ?
console.log(foo.__proto__ === Foo.prototype); // ?
第一问输出foo没有问题,第二问false,第三问true,第四问true。关键是第四问之后的连环追问:如果我想在一面里展示深度,可以主动补充一句“constructor属性是原型对象上的一个公开属性,正常情况下指向构造函数本身,但如果我们把Foo.prototype整体重新赋值了,constructor就会丢失指向,需要手动修正”。这个细节很多候选人不知道,一旦说出来
