JS闭包高频面试题及参考答案.docxVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 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是独立的

}

五、性能题:闭包会导致内存泄漏吗?为什么?如何避免?

参考答案:

闭包本身不会导致内存泄漏,但不当使用会导致内存无法释放,进而造成泄漏;

原因:闭包会引用外层函数的词法环境,如果闭包长期被持有(比如挂载在全局变量上),外层函数的局部变量就不会被垃圾回收机制回收,日积

文档评论(0)

151****9429 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档