【JavaScript面试题】经典JavaScript面试题,快来看一看你是不是一名合格的程序员

经典JavaScript面试题,快来看一看你是不是一名合格的程序员


话不多说,先看题,这段代码会在控制台打印出来什么结果?

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);

倒计时3 ~ 2 ~ 1 ~
下面公布答案:
在这里插入图片描述
不知道小伙伴们是不是都做对了?
小伙伴们刚拿到这道题的时候肯定是一头雾水。
这个返回值是个什么啊?
为什么函数在调用的时候就传了一个参数?
下面一一为大家解答。

我们先整理一下代码格式

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);

我们先看这个函数,
每次在调用的时候在控制台打印一遍“o”,
然后返回一个对象
{fun:function(m){return fun(m,n)} }
这个对象的Keyfun
Valuefunction(m){return fun(m,n)}

那么问题来了,
在最开始调用的时候,
fun(0),只传入了一个参数,这个参数给了谁呢,
我们不妨写个小demo来看一下。
在这里插入图片描述
我们发现在只传入一个参数的时候,js会默认传递给第一个,第二个不会赋值。


我们先看第一行
var a = fun(0);a.fun(1);a.fun(2);a.fun(3);
var a = fun(0)
fun(0);可以写成

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

会在一开始打印一遍"o",这个时候"o"是undefined
并返回一个键值对
{fun:function(m){return fun(m,0)}}
所以这个时时候a就是这个键值对。

当调用a.fun(1);的时候
就相当于找到a这个对象找到key值是fun的Key,传入Value值1,此时这个键值对变成
{fun: fun(1,0)}}
就相当于调用了fun(1,0)
n = 1
o = 0
这时会先执行console.log(o);
在控制台打印一个0
并返回一个键值对
{fun:function(m){return fun(m,1)}}

当调用a.fun(2);的时候
就相当于找到a这个对象找到key值是fun的Key,传入Value值2,此时这个键值对变成
{fun: fun(2,0)}}
就相当于调用了fun(1,0)
n = 2
o = 0
这时会先执行console.log(o);
在控制台打印一个0
并返回一个键值对
{fun:function(m){return fun(m,2)}}

当调用a.fun(3);的时候
就相当于找到a这个对象找到key值是fun的Key,传入Value值3,此时这个键值对变成
{fun: fun(3,0)}}
就相当于调用了fun(1,0)
n = 3
o = 0
这时会先执行console.log(o);
在控制台打印一个0
并返回一个键值对
{fun:function(m){return fun(m,3)}}

所以:
var a = fun(0);a.fun(1);a.fun(2);a.fun(3);这一行会在控制台打印出
undefined
0
0
0


接下来,
我们开始看b,
我们把b拆分,然后分别从
fun(0);
fun(0).fun(1);
fun(0).fun(1).fun(2);
fun(0).fun(1).fun(2).fun(3);

依次分析:

var b = fun(0)
先会执行console.log(o);
这个时候"o"还没有值
会打印出undefined
然后返回一个键值对
{fun:function(m){return fun(m,0)}}
这就相当于
var b = {fun:function(m){return fun(m,0)}};

var b = fun(0).fun(1)
相当于{fun:function(1){return fun(1,0)}}
fun(1,0)
这时
n = 1
o = 0
会先执行console.log(o);
在控制台打印一个0
并返回一个键值对
{fun:function(m){return fun(m,1)}}
此时
var b = {fun:function(m){return fun(m,1)}};

var b = fun(0).fun(1).fun(2)
相当于{fun:function(2){return fun(2,1)}}
fun(2,1)
这时
n = 2
o = 1
会先执行console.log(o);
在控制台打印一个1
并返回一个键值对
{fun:function(m){return fun(m,2)}}
此时
var b = {fun:function(m){return fun(m,2)}};

var b = fun(0).fun(1).fun(2).fun(3)
相当于{fun:function(3){return fun(3,2)}}
fun(3,2)
这时
n = 3
o = 2
会先执行console.log(o);
在控制台打印一个2
并返回一个键值对
{fun:function(m){return fun(m,3)}}
此时
var b = {fun:function(m){return fun(m,3)}};

所以:
var b = fun(0).fun(1).fun(2).fun(3);这一行会在控制台打印出
undefined
0
1
2


最后
我们开始看c
var c = fun(0).fun(1);
这个前面已经分析过
会在控制台分别打印
undefined
0

这时
var c = {fun:function(m){return fun(m,1)}};

c.fun(2);
相当于{fun:function(2){return fun(2,1)}}
fun(2,1)
这时
n = 2
o = 1
会先执行console.log(o);
在控制台打印一个1
并返回一个键值对
{fun:function(m){return fun(m,2)}}

c.fun(3);
相当于{fun:function(3){return fun(3,1)}}
fun(3,1)
这时
n = 3
o = 1
会先执行console.log(o);
在控制台打印一个1
并返回一个键值对
{fun:function(m){return fun(m,3)}}

所以:
var c = fun(0).fun(1);c.fun(2);c.fun(3);这一行会在控制台打印出
undefined
0
1
1

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值