闭包的一道面试题

360 阅读1分钟

来学习一道面试题

让我们先来复习一下闭包的概念,闭包就是外部函数嵌套一个内部函数,并且内部函数引用外部函数的局部变量,这样的结构构成闭包。
由于闭包的存在,所以外部函数执行完毕后,内部函数引用的变量不会被gc(内存回收机制)回收

    <!DOCTYPE html>
    <html>
        <head lang="en">
            <meta charset="UTF-8">
            <title></title>
        </head>
        <body>
        <script>
            var a= 0,b=0;
            function A(a){
                A=function(b){console.log(a+b++);}
                console.log(a);
            }
            A(1);    //1
            A(12);   //13
        </script>
        </body>
    </html>

正确的输出结果为1 13

我们来分析一下执行过程,其实也很简单,主要就是细心一点 

第一步执行A(1)的时候,形参a接收到的实参为1,我们发现A有一个内部函数,
发现内部函数也使用了变量a,并将引用指向了它的外部函数的变量a,
从而构成闭包(也就是说函数执行完毕后,a不会被内存回收机制回收,引用值为1)。
接着执行console.log(a) 执行结果是1。

第二步执行A(12)的时候,由于上一步已经将A重新赋值新函数。
A = function(b){console.log(a+b++)}
形参b接收到实参为12,由于闭包的原因,a的值依然为1,所以a+(b++) = 1+12=13
所以输出结果为13

通过以上的分析,是不是觉得很简单....哈哈