经典 JS 闭包面试题

news/2024/9/18 3:55:01/文章来源:https://www.cnblogs.com/yanjianjiang/p/18408584
function fun(n, o) {
  console.log(o)
  return {
    fun: function (m) {
      return fun(m, n);
    }
  };
}

var a = fun(0); a.fun(1); a.fun(2); a.fun(3);//undefined,?,?,?
var b = fun(0).fun(1).fun(2).fun(3);//undefined,?,?,?
var c = fun(0).fun(1); c.fun(2); c.fun(3);//undefined,?,?,?
 
 
答案: 
undefined 0 0 0
undefined 0 1 2
undefined 0 1 1
解答:

1、第一行a

vara=fun(0);a.fun(1);a.fun(2);a.fun(3);

可以得知,第一个fun(0)是在调用第一层fun函数。第二个fun(1)是在调用前一个fun的返回值的fun函数,所以:第后面几个fun(1),fun(2),fun(3),函数都是在调用第二层fun函数。

遂:

在第一次调用fun(0)时,o为undefined;

第二次调用fun(1)时m为1,此时fun闭包了外层函数的n,也就是第一次调用的n=0,即m=1,n=0,并在内部调用第一层fun函数fun(1,0);所以o为0;

第三次调用fun(2)时m为2,但依然是调用a.fun,所以还是闭包了第一次调用时的n,所以内部调用第一层的fun(2,0);所以o为0

第四次同理;

即:最终答案为undefined,0,0,0

2、第二行b

var b = fun(0).fun(1).fun(2).fun(3);//undefined,?,?,?

先从fun(0)开始看,肯定是调用的第一层fun函数;而他的返回值是一个对象,所以第二个fun(1)调用的是第二层fun函数,后面几个也是调用的第二层fun函数。

遂:

在第一次调用第一层fun(0)时,o为undefined;

第二次调用 .fun(1)时m为1,此时fun闭包了外层函数的n,也就是第一次调用的n=0,即m=1,n=0,并在内部调用第一层fun函数fun(1,0);所以o为0;

第三次调用 .fun(2)时m为2,此时当前的fun函数不是第一次执行的返回对象,而是第二次执行的返回对象。而在第二次执行第一层fun函数时时(1,0)所以n=1,o=0,返回时闭包了第二次的n,遂在第三次调用第三层fun函数时m=2,n=1,即调用第一层fun函数fun(2,1),所以o为1;

第四次调用 .fun(3)时m为3,闭包了第三次调用的n,同理,最终调用第一层fun函数为fun(3,2);所以o为2;

即最终答案:undefined,0,1,2

3、第三行c

var c = fun(0).fun(1); c.fun(2); c.fun(3);//undefined,?,?,?

根据前面两个例子,可以得知:

fun(0)为执行第一层fun函数,.fun(1)执行的是fun(0)返回的第二层fun函数,这里语句结束,遂c存放的是fun(1)的返回值,而不是fun(0)的返回值,所以c中闭包的也是fun(1)第二次执行的n的值。c.fun(2)执行的是fun(1)返回的第二层fun函数,c.fun(3)执行的也是fun(1)返回的第二层fun函数。

遂:

在第一次调用第一层fun(0)时,o为undefined;

第二次调用 .fun(1)时m为1,此时fun闭包了外层函数的n,也就是第一次调用的n=0,即m=1,n=0,并在内部调用第一层fun函数fun(1,0);所以o为0;

第三次调用 .fun(2)时m为2,此时fun闭包的是第二次调用的n=1,即m=2,n=1,并在内部调用第一层fun函数fun(2,1);所以o为1;

第四次.fun(3)时同理,但依然是调用的第二次的返回值,遂最终调用第一层fun函数fun(3,1),所以o还为1

即最终答案:undefined,0,1,1

 
来源: https://www.sohu.com/a/422560066_744986

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/795549.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从注册到实战,超简单图床使用(附代码实现本地图片转换为网络url)

1.注册一个薄荷图床的的账号,并添加客服申请api测试权限 ​ 查看api文档 我们只需关注两个必选参数即可,如图中红色标注 2.编写pthon代码 ​ 其他语言也可以,只要发送post请求即可,注意url、token和照片需要更改为你自己的 import requestsdef python_demo():url = https:…

【开源分享】PHP 在线客服系统源码 全开源无加密,支持自动刷新 网页即时接收消息

智能化在线客服系统也是其中一个必备功能。其智能化主要体现在细节中,在保持客服人员工作正常进行的情况下,让效率变高。智能化在线客服系统采取“轮询”的工单分配方式,让合适的客服人员处理合适的问题;提供“视图”功能,让客服人员专注于重要工单;强大的“搜索”功能,…

网络安全事件应急响应之专家运营篇

原创 袁哥大话安全 袁哥大话安全 一、工作内容 网络安全应急响应人员针对安全监测人员、业务部门或上级部门反馈的疑似安全事件进行研判,根据研判情况进行实际的上机排查和调查,以确定安全事件的原因、影响范围和解决方案。 网络安全事件应急响应的一般步骤: 1.1 网络安全事…

软件工程作业2:论文查重

论文查重 Github链接这个作业属于哪个课程 软件工程课程这个作业要求在哪里 https://edu.cnblogs.com/campus/gdgy/CSGrade22-34/homework/13229这个作业属于哪个课程 https://edu.cnblogs.com/campus/gdgy/CSGrade22-34/这个作业的目标 按照要求写一个查重软件PSP2.1 Personal…

24小时搜书Z-library最新国内访问入口镜像网址(持续更新)

24小时搜书Z-library简介24小时搜书Z-library,这是一个基于 IPFS 的电子书搜索引擎,收录了大量图书,据介绍有 1000万本以及8000篇文章,可以通过书名、作者、出版社、扩展名、ISBN 等多种信息进行搜索。各种常见的电子书格式如 pdf、mobi、epub、azw3 等都支持下载。Z-libra…

PDshell16反向pgsql中 Unable to list the columns. SQLSTATE = 22003不良的类型值 short : t 的解决方案

问题原因:pdshell逆向pg的sql脚本滞后,与pg新版本不兼容,解决方案:修改掉不兼容的sql代码1、Database->Edit Current DBMS,如下 2、PostgreSQL 9.x->Script->Objects找到Column和Key;如下 3、将 Column->SqlListQuery 选项里 SELECT 中的 c.attnotnull 替换…

高精度监测土体压应力变化量的最佳选择 GEO系列振弦式土压力计

高精度监测土体压应力变化量的最佳选择 GEO系列振弦式土压力计GEO系列振弦式土压力计广泛适用于长期测量土石坝、防波堤、护岸、码头岸壁、高层建筑、管道基础、桥墩、挡础所受土体的压应力,是了解土体对土中构筑物压应力变化量的有效监测设备。同时,它还可以同步测量埋设点的…

论文阅读翻译之Deep reinforcement learning from human preferences

论文阅读翻译之Deep reinforcement learning from human preferences 关于首次发表日期:2024-09-11 论文原文链接:https://arxiv.org/abs/1706.03741 论文arxiv首次提交日期:12 Jun 2017 使用KIMI,豆包和ChatGPT等机翻,然后人工润色 如有错误,请不吝指出Deep reinforceme…

最大熵原理[解释+例题]

1 熵的概念 熵是热力学中的一个概念,由香浓引入到信息论中。在信息论中,熵是衡量随机变量不确定性的量度,熵越大表示随机变量的不确定性越大,即随机变量越难以预测。 2 熵的计算信息熵的计算可以看笔者的博客:点此跳转。 3 最大熵原理定义 最大熵原理是一种选择随机变量统…

9.9 ~ 9.15

没有摘要9.9 whk 正常上课。 感觉自己一到教室就困,怎么会是呢 总不能是教室人太多缺氧了吧( OI 我干啥了?我干啥了?我干啥了? 9.10 whk 教师节。 所以每节课上课之前我们都会起立并大喊“祝老师教师节快乐”; 然后在奥赛课上也这么干了,给了 \(\text{Huge}\) 一点小小的…

PowerDesigner 逆向工程 Could not Initialize JavaVM!

原项目的大量的表,使用PowerDesigner 进行逆向工程。提示Could not Initialize JavaVM! 网上找到原因,PowerDesigner 不可以使用64位JDK环境!有一种不修改环境变量的方法 在PowerDesigner目录下,建立一个启动批处理,如:startup.bat,在其中配置JAVA_HOME、CLASSPATH,如…

解锁数据潜力,天翼云TeleDB为企业数智蝶变添力赋能!

近日,第15届中国数据库技术大会(DTCC2024)在北京召开。大会以“自研创新 数智未来”为主题,重点围绕向量数据库与向量检索技术实践、数据治理与数据资产管理、云原生数据库开发与实践、特定场景下的数据库管理与优化、大数据平台建设等内容展开分享和探讨。近日,第15届中国…