• Web | JavaScript的闭包


    闭包

    function outter(){
        var a = 1;
        function inner(){
            console.log(a);
        }
        return inner;
    }
    //进行函数调用
    var inner = outter();
    inner();
    

    以上代码是最基本的闭包的形成.当outter函数开始调用的时候,它内部就形成了一个闭包,这个闭包存在使用了outter函数的a变量的inner函数的作用域中.所以当inner函数调用的时候,才能够仍然访问到outter函数的a变量.

    所以可以看到闭包的一些特性.

    闭包的形成:当外部函数的执行上下文被启动的时候,或者说是外部函数被调用的时候

    闭包的位置: 闭包存放在内部函数的作用域中,名称为closure.

    闭包的作用:能够让内部函数在外依然能够访问到外部函数的变量,延长了该变量的生命周期.

    闭包的形成条件: 函数内里嵌套函数,并且内函数使用到了外部函数的变量.

    闭包的释放: 闭包不会主动销毁,会造成轻微的内存泄露.可以自己选择主动的对内部方法进行释放,置为null.

    那么闭包在JS中有何作用,我觉得闭包很大的作用在于弥补了JS语言的一些数据私密性的缺陷.

    在JS中,没有类的概念,一切以函数为尊.而函数内部的一些属性和方法保证了一些权限,不可访问.那么这个时候闭包的作用就显现出来的.有点相当于其他语言中,构造了一些私有的属性和方法,然后提供了一个公开的接口以供访问调用,然后可以保证一些安全性.

    在JS中,通过提供返回的一个函数内部方法,暴露一些可以公开的变量或者方法让人进行访问.

    function Person(){
        var name = "Jan";
        // 名字可以公开,但是年纪不能公开
        var age = 18;
        function about(){
            console.log('我的名字是'+this.name);
        }
        return about;
    }
    

    常见的闭包

    1. 将函数作为另一个函数的返回值
    2. 将函数作为实参传递给另一个函数调用

    闭包相关面试题

    function fun(n, o) {
        console.log(o)
        return {
          fun: function (m) {
            return fun(m, n)
          }
        }
      }
      var a = fun(0)
      a.fun(1)  // -- var b = fun(1,0)
      a.fun(2) // var c = fun(2,0);
      a.fun(3) //  var d  = fun(3,0)
      // 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
    
    
  • 相关阅读:
    MySQl数据约束练习
    MySQL查询实例
    网络通信协议简介(TCP与UDP)
    数据类型转换
    C++编译过的C代码为什么要用extern C
    hashtable
    以RB-tree为底层机制的几个关联式容器
    红黑树(RB-Tree)
    slist
    deque
  • 原文地址:https://www.cnblogs.com/JanChuJun/p/10146960.html
Copyright © 2020-2023  润新知