鱼C论坛

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

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

[复制链接]
发表于 2022-10-2 20:18:27 | 显示全部楼层 |阅读模式
60鱼币
请解释如下代码的运行结果?
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);
  var b = fun(0).fun(1).fun(2).fun(3);
  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,结果如下:
0
0
0
0
接下来,我们连续调用 fun(0).fun(1).fun(2).fun(3)。注意,每次调用 fun 方法都会返回一个对象,该对象有一个 fun 方法。因此,我们可以链式调用这些方法,结果如下:
0
1
2
3
最后,我们调用了 fun(0).fun(1),输出了 0,并返回一个对象,该对象有一个 fun 方法,可以连续调用 c.fun(2) 和 c.fun(3),结果如下:
0
1
0
0
因此,整个程序的输出结果为:
0
0
0
0
0
1
2
3
0
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 方法。因此,我们可以链式调用这些方法,结果如下: 最后,我们调用了 ...
想知道小甲鱼最近在做啥?请访问 -> 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,结果如下:
0
0
0
0
接下来,我们连续调用 fun(0).fun(1).fun(2).fun(3)。注意,每次调用 fun 方法都会返回一个对象,该对象有一个 fun 方法。因此,我们可以链式调用这些方法,结果如下:
0
1
2
3
最后,我们调用了 fun(0).fun(1),输出了 0,并返回一个对象,该对象有一个 fun 方法,可以连续调用 c.fun(2) 和 c.fun(3),结果如下:
0
1
0
0
因此,整个程序的输出结果为:
0
0
0
0
0
1
2
3
0
0

评分

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

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-10-3 11:07:43 | 显示全部楼层
重复循环执行m,n,o a,b,c次?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

你先运行一下结果看看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-5-7 17:04:20 | 显示全部楼层
函数形参的赋值是按形参个数来看,只用一个实参给两个形参赋值时,只有第一个形参会被赋值,其他形参值为undefined
想知道小甲鱼最近在做啥?请访问 -> 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
有用请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-22 06:50

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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