经典面试题解析-闭包

function fun(n, o) {
                console.log(o)
                return {
                    fun: function(m) {
                        return fun(m, n);
                    }
                };
            }

  1. var a = fun(0);a.fun(1);a.fun(2);a.fun(3);

  2. var b = fun(0).fun(1).fun(2).fun(3);

  3. var c = fun(0).fun(1);c.fun(2);c.fun(3);

  4. //问:三行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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值