- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
闭包高频面试题及参考答案
一、基础理解题:什么是闭包?请用自己的话解释,并写一个最简单的闭包示例
参考答案:
闭包本质是「函数+函数所处的词法环境」的组合——内层函数引用了外层函数的变量/参数,且内层函数被外层函数之外的地方调用时,外层函数的词法环境不会被销毁,这些变量/参数会被“保留”下来供内层函数使用。
最简单示例:
functionouter(){
constname=张三;//外层函数变量
functioninner(){
console.log(name);//内层函数引用外层变量
}
returninner;//外层函数返回内层函数
}
constfn=outer();
fn();//输出:张三(此时outer已执行完毕,但name仍被inner引用,形成闭包)
二、应用题:用闭包实现一个计数器,要求每次调用返回递增的数字(从1开始),且不能用全局变量
参考答案:
核心思路:用外层函数保存计数器初始值,内层函数负责递增并返回结果,利用闭包保留计数器状态:
functioncreateCounter(){
letcount=0;//闭包保留的状态变量(非全局)
returnfunction(){
count++;
returncount;
};
}
constcounter=createCounter();
console.log(counter());//1
console.log(counter());//2
console.log(counter());//3
三、陷阱题:以下代码执行后输出什么?为什么?如何修改能让它输出0、1、2?
for(vari=0;i3;i++){
setTimeout(()={
console.log(i);
},1000);
}
参考答案:
实际输出:333(三个3)
原因:var声明的变量没有块级作用域,只有函数作用域/全局作用域。循环中每次迭代的i都是同一个全局变量,setTimeout是异步执行(1秒后),此时循环已结束,i已变成3,三个回调函数引用的都是同一个i,所以输出三个3。
修改方案(两种常用方式):
用let声明(块级作用域,每次迭代创建新变量):
for(leti=0;i3;i++){
setTimeout(()={
console.log(i);//输出0、1、2
},1000);
}
用闭包保留每次迭代的i值:
for(vari=0;i3;i++){
(function(j){//立即执行函数,j接收当前i的值
setTimeout(()={
console.log(j);//输出0、1、2
},1000);
})(i);
}
四、原理题:闭包为什么能让外层函数的变量不被销毁?它的优缺点是什么?
参考答案:
变量不销毁的原因:
函数执行时会创建“执行上下文”,执行完毕后正常会被垃圾回收机制回收。但如果外层函数的变量被内层函数引用,且内层函数被外部持有(比如被返回、被其他函数引用),垃圾回收机制会认为这些变量“仍在被使用”,不会回收外层函数的词法环境,因此变量得以保留。
优缺点:
优点:①保留函数状态(如计数器、缓存);②避免全局变量污染(把变量封装在闭包中,不暴露到全局);③实现模块化(隐藏内部实现,只暴露接口)。
缺点:①内存占用:闭包会保留外层函数的词法环境,长期持有可能导致内存泄漏(比如闭包引用了DOM元素,DOM已删除但闭包未释放);②可读性降低:多层闭包会让代码嵌套变深,不易理解。
五、实际场景题:闭包在实际开发中有哪些应用场景?举1-2个具体例子
参考答案:
场景1:缓存函数(记忆函数)——缓存计算结果,避免重复计算(比如复杂运算、接口请求结果):
functioncreateCache(){
constcache={};//闭包保存缓存数据
returnfunction(key,calcFn){
if(cache[key]){
console.log(从缓存获取);
returncache[key];
}
constresult=calcFn();//执行计算函数
cache[key]=result;//存入缓存
console.log(计算后缓存);
r
原创力文档


文档评论(0)