JavaScript 回调函数面试题
程序员文章站
2022-04-05 16:09:23
...
回调函数
直接上题:
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 b = fun(0);
b = b.fun(1);
b = b.fun(2);
b = b.fun(3);
var c = fun(0).fun(1);
c.fun(2);
c.fun(3);
//问:三部分a,b,c的输出分别是什么?
先来分析 a 部分:
//返回对象 { fun: function(m){ return fun(m, n); }被变量a接收
var a = fun(0); //undefined
//因为回调,函数fun()的执行期上下文并没有销毁 对象中没有n所以会引用 外层的n =0;
a.fun(1);// 0
a.fun(2);// 0
a.fun(3); // 0
1.fun(0)先执行再赋值。执行结果形参o在预编译的时候值为undefined且执行时没有进行赋值;因此此处输出undefined。
2.fun(1)、fun(2)和fun(3)直接执行赋值到返回对象中的内层函数,而内层函数是以回调的形式执行外层函数,这里注意参数变化。
3.输出 o = n = (第一步保存的 n 的值)。
再来分析 b 部分:
先看输出结果:
var b = fun(0).fun(1).fun(2).fun(3);// undefined (换行) 0 (换行) 1 (换行) 2
var b = fun(0);//undefined
b = b.fun(1);// 0
b = b.fun(2);// 1
b = b.fun(3);// 2
先看分开写的b部分:
区别于 a 部分,b 部分将每一步执行后存储在变量 b(这里可以理解为内层函数) 里的变量 n 的值更新了,所以输出的 o = n =(上一步保存的n的值)。
再看以上那段长的代码:
其实就是:函数调用+函数赋值+更新变量(n)。
最后分析 c 部分:
var c = fun(0).fun(1);// undefined (控制台换行) 0
c.fun(2);// 1
c.fun(3);// 1
看到这里再结合 a 和 b 的分析,其实就是看保存在变量里的 n 是否更新;c 部分 只保存了 fun(1)执行后n = 1;因此最后两段代码执行输出的 o = n =(第二步保存的n的值)。
上一篇: 笔试刷题-头条
下一篇: Java面试题——数组求和统计