美文网首页工作生活
一道经典的作用域闭包面试题

一道经典的作用域闭包面试题

作者: isSunny | 来源:发表于2019-07-04 18:08 被阅读0次
    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);     //undefined 0 0 0     
    var b = fun(0).fun(1).fun(2).fun(3);                  //undefined 0 1 2
    var c = fun(0).fun(1); c.fun(2); c.fun(3);  //undefined 0 1 1
    
    

    最外层的fn()和最里层的fun()属于一个函数,而第二个fun是另一个新的函数。(注明:所有声明的匿名函数都是一个新函数)。

    1.当a=fun(0),相当于n=0,而o没有传值,所以console出来是undefined;
    a.fun(1),由于闭包,此时n=0依然存在,执行fun(0,undefined).fun(1),返回fun(m,n),此时传值m=1,n=0,此时console出来的值为0;同理a.fun(2)和a.fun(3)相当于fun(2,0)和fun(3,0),所以打印出来的都是0。

    2.当b= fun(0),和第一个一样,都是没有给o传值,因此为undefined;
    .fun(1)同上面第二个是一样的,所以打印出来也是0;
    fun(0).fun(1).fun(2),此时返回的函数是第二次执行的返回对象,所以此时n的值为1,m值为2,相当于fun(2,1),所以打印出来的值为1;
    fun(0).fun(1).fun(2).fun(3),此时n值变为2,m值为3,相当于fun(3,2),所以打印出来的值为2。

    3.当c=fun(0),和前面同理,因此为undefined;
    fun(0).fun(1)同上面第二个是一样的,所以打印出来也是0;
    c.fun(2),此时n=1,m=2,fun(2,1),所以打印出来的值为1;
    c.fun(3),此时n=1,m=3,fun(3,1),所以打印出来的值为1;

    什么是闭包:

    1.函数内部的函数;
    2.有权访问另一个函数作用域变量的函数;
    3.闭包会使变量被引用不能被垃圾回收机制收回,所以如果该变量不再用,请手动释放,可以将值设置为null,避免发生内存泄漏。

    闭包是将函数内部和函数外部连接起来的桥梁。

    用处:

    1.读取函数内部的变量;
    2.这些变量的值始终保持在内存中,不会在外层函数调用后被自动清除。

    闭包的好处:

    1:希望一个变量长期驻扎在内存中;
    2:避免全局变量的污染;
    3:私有成员的存在 。

    相关文章

      网友评论

        本文标题:一道经典的作用域闭包面试题

        本文链接:https://www.haomeiwen.com/subject/fohrhctx.html