前端面试题,试题刷来刷去,试题最后发现考的试题还是那几样:闭包、原型链、试题事件循环、试题跨域。试题但你真以为背熟答案就稳了?试题我面过不下三十个候选人,简历上写着“精通JavaScript”,试题结果一问this指向,试题支支吾吾半天,试题最后憋出一句“这个我平时都用箭头函数”。试题
行吧,试题箭头函数确实能避开一半的试题坑。但面试官问的试题是你理不理解为什么要避开。知其然不知其所以然,试题这是最常见的死法。
举个例子,var和let的区别。标准答案是“var有变量提升,let没有”。然后呢?没了。但你要是能说出“var在for循环里声明同一个变量,循环结束后i还活着,而let每次迭代都会创建新的绑定”,那面试官眼睛会亮一下。再补一句“所以用let能避免经典的闭包陷阱”,这就不是背答案了,是理解。
另一个高频考点是事件循环。别急着背宏任务微任务的顺序——先想想为什么要有这个机制。JS是单线程的,但浏览器要渲染、要处理用户交互、要跑网络请求。如果所有事都排队同步执行,页面卡成PPT。事件循环的本质是调度:把耗时的IO操作扔给浏览器底层,等结果回来了再塞回JS线程。理解了这层,你自然能推导出“setTimeout的延迟时间不准确,因为要等当前任务栈清空”这种隐藏考点。
说到跨域,很多人的反应是“用CORS啊”。但CORS只是服务器配合的解决方案。你做过纯前端的项目吗?开发环境用webpack-dev-server代理,生产环境用nginx反向代理——那为什么代理能解决跨域?因为跨域限制是浏览器的行为,不是HTTP协议的限制。服务器之间请求数据根本没有跨域这回事。代理就是让浏览器请求同源的地址,再由服务器转发。这个逻辑想通了,你就能回答“为什么JSONP只能用GET”了——因为它是动态创建script标签,而script标签的加载不受同源策略限制,但只能通过URL传参。
最近两年面试还喜欢问“如果页面加载慢,你怎么排查”。别一上来就扯性能优化工具。先看网络面板,是不是有资源没压缩?再看代码,有没有同步加载了阻塞渲染的脚本?最后看渲染过程,有没有强制同步布局(比如循环里读offsetWidth再改样式)?我见过一个候选人,张口就是“用懒加载”,但连懒加载的原理是IntersectionObserver还是监听scroll都说不清——这种回答比直接说“不会”还减分。
其实面试题没那么玄乎,它考的是你在真实开发中踩过多少坑,以及踩完坑之后有没有琢磨过原因。你要是只刷题,能过笔试,但一到现场面,面试官换个问法就露馅。比如“你项目里遇到过内存泄漏吗”,这题没有标准答案,但你要是能讲出“我之前用addEventListener绑定了事件,组件销毁时忘了移除,导致每次切换路由都多一份监听”,那比背十道概念题都管用。
最后说个偏门的。面试官偶尔会问“你最近在看什么技术”。别说什么“我在学Vue3”——这太敷衍了。说“我在看浏览器渲染管线的源码”或者“我研究了Web Worker在图像处理里的实际应用”,这才让人觉得你有好奇心。技术这行,热情是藏不住的。你装不出来,也背不出来。