欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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 部分:

JavaScript 回调函数面试题

 //返回对象 {  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的值)。
再看以上那段长的代码:
JavaScript 回调函数面试题其实就是:函数调用+函数赋值+更新变量(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的值)。