King丨小义 发表于 2022-10-2 20:18:27

一道超难的JS闭包题

请解释如下代码的运行结果?

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);

巅峰老甲鱼1 发表于 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

编程追风梦 发表于 2022-10-3 11:07:43

重复循环执行m,n,o a,b,c次?

King丨小义 发表于 2022-10-3 13:02:02

编程追风梦 发表于 2022-10-3 11:07
重复循环执行m,n,o a,b,c次?

你先运行一下结果看看

害羞的新手 发表于 2023-5-7 17:04:20

函数形参的赋值是按形参个数来看,只用一个实参给两个形参赋值时,只有第一个形参会被赋值,其他形参值为undefined

sfqxx 发表于 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
有用请设置最佳答案
页: [1]
查看完整版本: 一道超难的JS闭包题