一道超难的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); 首先,我们调用了 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
重复循环执行m,n,o a,b,c次? 编程追风梦 发表于 2022-10-3 11:07
重复循环执行m,n,o a,b,c次?
你先运行一下结果看看 函数形参的赋值是按形参个数来看,只用一个实参给两个形参赋值时,只有第一个形参会被赋值,其他形参值为undefined 这段代码定义了一个名为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]