面试 -- 一道牛客网的题

原题

题目描述

请修复给定的 js 代码中,函数定义存在的问题

示例1

输入

true

输出

a

题目代码

function functions(flag) {
    if (flag) {
      function getValue() { return 'a'; }
    } else {
      function getValue() { return 'b'; }
    }

    return getValue();
}

我在Chrome和edge都试了一下,题目原本就是能输出正确结果的,所以题目下面有的人的解答拿到高赞真是。。。

然后打断点走了一下,发现运行顺序是这样的:


function functions(flag) {
    if (flag) {//2 
      function getValue() { return 'a'; }// 4
    } else {
      function getValue() { return 'b'; }
    }

    return getValue();// 3
}
functions(true); // 1

注意这里2判断了true之后直接执行3,通过3执行4,定义并执行函数getValue。

有的人会问,为什么if(flag)成立,直接执行3不执行if里面的函数定义呢?我也不知道,但是我控制台对if(true)进行watch的时候,控制台报了一个错,而这个错,console里面居然没有打印出来:

所以if(true)里面的函数定义没能执行,原因,暂时还不知道。

然后我又在IE5下面执行了这个代码,发现IE5下面不管是if(true)还是if(false)都会返回"b",然后我又在IE5下面这样试了一下:

function functions(flag) {debugger
    if (flag) {
      function getValue() { return 'a'; }
    } else {
      function getValue() { return 'b'; }
    }

    return getValue();
}
functions(true)

进入debugger后,还没执行下一步,这时候在控制台查看getVale,函数已经存在且为

所以这就是函数声明提前,return "b"那个把return "a"给覆盖了。高版本浏览器估计是发现了这问题,所以报错并且帮我们自动纠正了?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值