鱼C论坛

 找回密码
 立即注册
查看: 2509|回复: 5

[已解决]一道超难的JS闭包题

[复制链接]
发表于 2022-10-2 20:18:27 | 显示全部楼层 |阅读模式
60鱼币
请解释如下代码的运行结果?

  1. function fun(n ,o){
  2.     console.log(o);
  3.     return {
  4.       fun: function(m){
  5.         return fun(m, n);
  6.       }
  7.     }
  8.   }
  9.   var a = fun(0); a.fun(1); a.fun(2); a.fun(3);
  10.   var b = fun(0).fun(1).fun(2).fun(3);
  11.   var c = fun(0).fun(1); c.fun(2); c.fun(3);
复制代码
最佳答案
2022-10-2 20:18:28
首先,我们调用了 fun(0),输出了 0,返回了一个对象,该对象有一个 fun 方法,该方法接受一个参数 m,并调用 fun(m, n)。因此,我们可以连续调用 a.fun(1)、a.fun(2) 和 a.fun(3)。每次调用都会输出之前传递的 n,也就是 0,结果如下:
  1. 0
  2. 0
  3. 0
  4. 0
复制代码

接下来,我们连续调用 fun(0).fun(1).fun(2).fun(3)。注意,每次调用 fun 方法都会返回一个对象,该对象有一个 fun 方法。因此,我们可以链式调用这些方法,结果如下:
  1. 0
  2. 1
  3. 2
  4. 3
复制代码

最后,我们调用了 fun(0).fun(1),输出了 0,并返回一个对象,该对象有一个 fun 方法,可以连续调用 c.fun(2) 和 c.fun(3),结果如下:
  1. 0
  2. 1
  3. 0
  4. 0
复制代码

因此,整个程序的输出结果为:
  1. 0
  2. 0
  3. 0
  4. 0
  5. 0
  6. 1
  7. 2
  8. 3
  9. 0
  10. 0
复制代码

最佳答案

查看完整内容

首先,我们调用了 fun(0),输出了 0,返回了一个对象,该对象有一个 fun 方法,该方法接受一个参数 m,并调用 fun(m, n)。因此,我们可以连续调用 a.fun(1)、a.fun(2) 和 a.fun(3)。每次调用都会输出之前传递的 n,也就是 0,结果如下: 接下来,我们连续调用 fun(0).fun(1).fun(2).fun(3)。注意,每次调用 fun 方法都会返回一个对象,该对象有一个 fun 方法。因此,我们可以链式调用这些方法,结果如下: 最后,我们调用了 ...
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-10-2 20:18:28 | 显示全部楼层    本楼为最佳答案   
首先,我们调用了 fun(0),输出了 0,返回了一个对象,该对象有一个 fun 方法,该方法接受一个参数 m,并调用 fun(m, n)。因此,我们可以连续调用 a.fun(1)、a.fun(2) 和 a.fun(3)。每次调用都会输出之前传递的 n,也就是 0,结果如下:
  1. 0
  2. 0
  3. 0
  4. 0
复制代码

接下来,我们连续调用 fun(0).fun(1).fun(2).fun(3)。注意,每次调用 fun 方法都会返回一个对象,该对象有一个 fun 方法。因此,我们可以链式调用这些方法,结果如下:
  1. 0
  2. 1
  3. 2
  4. 3
复制代码

最后,我们调用了 fun(0).fun(1),输出了 0,并返回一个对象,该对象有一个 fun 方法,可以连续调用 c.fun(2) 和 c.fun(3),结果如下:
  1. 0
  2. 1
  3. 0
  4. 0
复制代码

因此,整个程序的输出结果为:
  1. 0
  2. 0
  3. 0
  4. 0
  5. 0
  6. 1
  7. 2
  8. 3
  9. 0
  10. 0
复制代码

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
King丨小义 + 5 + 5 鱼C有你更精彩^_^

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-10-3 11:07:43 | 显示全部楼层
重复循环执行m,n,o a,b,c次?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-10-3 13:02:02 | 显示全部楼层
编程追风梦 发表于 2022-10-3 11:07
重复循环执行m,n,o a,b,c次?

你先运行一下结果看看
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-5-7 17:04:20 | 显示全部楼层
函数形参的赋值是按形参个数来看,只用一个实参给两个形参赋值时,只有第一个形参会被赋值,其他形参值为undefined
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-5-7 17:14:46 | 显示全部楼层
这段代码定义了一个名为fun的函数,并使用递归的方式创建了一个对象,其中该对象具有fun属性,其值为一个返回新对象的匿名函数。每次调用fun时,它都会打印传递给它的第二个参数o,然后返回新对象。

- a = fun(0);a.fun(1);a.fun(2);a.fun(3);
  
  执行fun(0)将o设置为0并返回fun属性为闭包的新对象赋值给变量a,接下来在a上连续调用fun方法分别传入1、2和3作为参数。在每个调用中,当前实例的o参数都被忽略,而是使用先前保存的父级n值,因此输出结果如下:

  
  0
  0
  0
  0
  

- b = fun(0).fun(1).fun(2).fun(3);

  这行代码通过连续调用fun方法,将新对象分配给变量b。首先,fun(0)返回一个包含fun属性为闭包的新对象,我们可以直接调用fun属性返回一个新对象(o参数仍然是0),之后每个传入的m都成为当前实例的新n值,输出结果如下:

  
  0
  1
  2
  3


- c = fun(0).fun(1); c.fun(2); c.fun(3);

  这行代码同样通过连续调用fun方法将新对象分配给变量c。首先,fun(0)返回一个包含fun属性为闭包的新对象,然后使用此变量调用fun(1),该结果返回一个包含fun属性的新不同实例。接下来在该实例上连续调用fun方法分别传入2和3作为参数,但每当调用fun方法时,都是从fun(1)的实例开始的,因此输出结果如下:

0
1
1
有用请设置最佳答案
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-5-4 21:30

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表