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);
-
//问:三行a,b,c的输出分别是什么?
解析:
var a = fun(0); //undefined
a.fun(1); //0
a.fun(2); //0
a.fun(3); //0
/*主要考察闭包
分析:fun(0)返回是一个对象a
{
fun: function(m) {
return fun(m, 0);
}
},fun(0)执行时参数n=0,o是underfine,返回对象里函数方法参数n是没有的,然后回去上一级作用域中找n,n=0;
理解这句话:这个对象的作用域中没有n,它就继续沿着作用域向上一级的作用域中寻找n,最后在函数fun中找到了n,n的值是0
a.fun(1)=>fun(1,0)
a.fun(2)=>fun(2,0)
a.fun(3)=>fun(3,0)
*
* */
var b = fun(0).fun(1).fun(2).fun(3);
//undefined
//0
//1
//2
/*
分析: 改成:var a = fun(0);a=a.fun(1);a=a.fun(2);a=a.fun(3);与b是等价的
1. fun(0)执行时,参数n=0,o是underfine=>接着返回对象a:{
fun: function(m) {
return fun(m, 0);
}
};=>n=0
2.a.fun(1)=>fun(m, 0);=>fun(1,0)=>输出o为0;
n=1,o=0;=>接着返回对象a:{
fun: function(m) {
return fun(m, 1);
}
};=>n=1
3.a.fun(2)=>fun(m, 1);=>fun(2, 1);=>输出o为1;
n=2,o=1;=>接着返回对象a:{
fun: function(m) {
return fun(m, 2);
}
};=>n=2
4.a.fun(3)=>fun(m, 2);=>fun(3, 2);=>输出o为2;
n=3,o=2;=>接着返回对象a:{
fun: function(m) {
return fun(m, 3);
}
};=>n=3
*
* */
var c = fun(0).fun(1);
//undefined
//0
c.fun(2); //1
c.fun(3); //1
/*
分析:fun(0).fun(1)同上分析第一步和第二步;输出underfine和0
1.c对象 = fun(0).fun(1)=>fun(m, 0);=>fun(1,0)=>输出o为0;
n=1,o=0;=>接着返回对象a:{
fun: function(m) {
return fun(m, 1);
}
};=>n=1
2. c.fun(2)=>fun(m, 1);=>fun(2, 1);=>输出o为1
3. c.fun(3)=>fun(m, 1);=>fun(3, 1);=>输出o为1
* */
参考解析:https://blog.csdn.net/qq_36375195/article/details/79515958