来看一道关于js作用域的面试题

本文通过一道JavaScript面试题解析了函数重写与闭包的概念。题目涉及全局变量、函数调用顺序以及作用域。解析过程中强调了第一次调用A时执行的是外层函数,第二次调用则是内层函数,利用闭包保留了外层函数的变量。建议在遇到类似问题时使用断点调试辅助理解。
摘要由CSDN通过智能技术生成

今天我看了一篇关于面试题的推文,结果感觉确实挺有难度的,我只看到了题目和答案,没看到解析。现在想明白了一道题,我来解析给大家看看。

题目如下:

 var a = 0,  
            b = 0;
        function A(a) {
            A = function (b) {
                console.log(a + b++)
            }
            console.log(a++)
        }
        A(1)
        A(2)

答案是:先给你一点时间,自己思考哦~

5

4

3

2

1

答案揭晓:1 4

下面来谈一下我对这道题的理解吧。

首先,这里声明了两个全局变量a,b,初始值都是0。(虽然这里换行了,而且JavaScript有“自动加分号”的规则,但是a=0后面有逗号,这样是不会加分号的,它们仍然是同一句)

 var a = 0,  
            b = 0;

然后,来看这里,这是本题的重点。

 function A(a) {
     A = function (b) {
         console.log(a + b++)
     }
     console.log(a++)
  }

外面的function A是函数声明,声明了全局函数A。

里面给A赋值了,注意,里面的“A”前面没有var或者let或者const,所以是在给A赋值,而A函数里面没有声明A变量,所以是给全局变量,或者说是“全局函数A”赋值了。

A(1)
A(2)

最后,调用了两次A函数。

过程是这样的:

一开始,代码初始化完了,A函数并没有被执行在它被执行之前,它并没有被重新赋值,因此第一次调用A的时候,调用的是外层的A函数。

所以,外层的a函数接受参数a,a为1。

然后,给A重新赋值,A变成了里面的函数。

接着,继续执行外层的A函数,所以输出了a,输出的是1。(这里的++在后面,因此先输出a,后让a自增,a变成了2)

第二次调用A,调用的就是内层的A函数了,接受的参数是b,b等于2。

虽然A函数变成里面这个了,但是里面这个A使用到了外层函数的a参数,所以外层函数作为闭包,保留了a参数。

最后输出a + b++,相当于输出a+b。b是2,a也是2,所以输出4。

 

最后说一下我个人的看法:

我一开始在做的时候,看到里面给A赋值了,我第一反应是,既然覆盖了A,那A就是里面那个啊,管外面的干嘛?后来才反应过来,A第一次执行之后才会被覆盖,因此第一次执行的是外层的A函数,赋值以后再输出a参数,并且让a自增。我是后来打断点调试,然后发现第一次输出在下面一行,第二次输出在上面一行才恍然大悟。

遇到不懂的问题,也可以跟我一样打断点,进行观察和推理呀。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值