- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
JS闭包高频面试题及参考答案
一、基础概念题:什么是闭包?闭包的核心作用是什么?
参考答案:
闭包本质是「函数+函数声明时所处的词法环境」的组合。简单说,就是一个函数在定义时能访问外层函数的变量,即使外层函数已经执行完毕,这个内层函数依然能拿到外层的变量和作用域。
核心作用有两个:①延长外层函数局部变量的生命周期(不让垃圾回收机制回收);②实现变量私有化(让外部无法直接修改,只能通过闭包提供的接口操作)。
二、代码输出题:以下代码执行后控制台输出什么?为什么?
functionouter(){
letnum=10;
functioninner(){
num++;
console.log(num);
}
returninner;
}
constfn1=outer();
constfn2=outer();
fn1();//输出?
fn1();//输出?
fn2();//输出?
参考答案:
输出依次是11、12、11。
原因:每次调用outer()都会创建一个新的词法环境(里面的num是独立的)。fn1是第一个outer执行后返回的inner,它绑定的是第一个num(初始10),所以两次调用fn1会让num依次加1;而fn2是第二个outer执行后返回的inner,绑定的是新的num(初始10),第一次调用就输出11。
三、实际应用题:用闭包实现一个计数器,要求支持递增、递减、重置功能
参考答案:
functioncreateCounter(initial=0){
letcount=initial;//私有变量,外部无法直接访问
return{
increment:()=count++,
decrement:()=count--,
reset:()={count=initial;},
getCount:()=count
};
}
//使用示例
constcounter=createCounter(5);
console.log(counter.getCount());//5
counter.increment();
counter.increment();
console.log(counter.getCount());//7
counter.decrement();
console.log(counter.getCount());//6
counter.reset();
console.log(counter.getCount());//5
核心思路:通过外层函数createCounter定义私有变量count,返回的对象方法(闭包)可以访问和修改count,但外部无法直接操作count,实现了变量私有化和功能封装。
四、踩坑题:以下代码循环中使用闭包,输出结果是什么?如何修复让它输出0、1、2、3、4?
for(vari=0;i5;i++){
setTimeout(()={
console.log(i);
},1000);
}
参考答案:
实际输出:5个5(而非0-4);
原因:var声明的变量没有块级作用域,只有函数作用域,循环中所有setTimeout里的回调函数共享同一个i。循环执行速度极快(1秒内已完成),此时i已经变成5,1秒后回调执行时打印的都是5;
修复方案(两种常用方式):
方案1:用let替代var(let有块级作用域,每次循环会创建独立的i):
for(leti=0;i5;i++){
setTimeout(()={
console.log(i);//输出0、1、2、3、4
},1000);
}
方案2:用立即执行函数(IIFE)创建闭包,保存每次循环的i:
for(vari=0;i5;i++){
(function(j){
setTimeout(()={
console.log(j);//输出0、1、2、3、4
},1000);
})(i);//每次循环把当前i作为参数传入,j是独立的
}
五、性能题:闭包会导致内存泄漏吗?为什么?如何避免?
参考答案:
闭包本身不会导致内存泄漏,但不当使用会导致内存无法释放,进而造成泄漏;
原因:闭包会引用外层函数的词法环境,如果闭包长期被持有(比如挂载在全局变量上),外层函数的局部变量就不会被垃圾回收机制回收,日积
您可能关注的文档
最近下载
- IFC050-Modbus通讯说明文件.docx VIP
- 《金川雪梨膏》标准文本.pdf VIP
- 2025年中国冷藏汽车行业市场深度评估及投资策略咨询报告.docx
- 市政管网工程项目施工方案施工组织设计.doc VIP
- 认证质量管理(ISO9001)手册(质量管理体系).pdf VIP
- 中国神经外科重症患者感染诊治专家共识CB.ppt VIP
- GB50366-2005 地源热泵系统工程技术规范.docx VIP
- SOLAS公约2016年中文综合文本(船海人版)- 第III章 救生设备和装置.pdf VIP
- 2024年南京市浦口区中医院招聘考试真题.docx VIP
- 中国谷物播种机市场供需现状及投资战略研究报告.docx
原创力文档


文档评论(0)