zoukankan      html  css  js  c++  java
  • 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
    
    
  • 相关阅读:
    全面解释java中StringBuilder、StringBuffer、String类之间的关系
    如何解决Java.lang.NoClassDefFoundError--第一部分
    Java中Vector和ArrayList的区别
    深入研究java.lang.ThreadLocal类
    Frame.pack()与frame.validate()方法的区别
    Oracle中start with...connect by子句的用法
    Java 的swing.GroupLayout布局管理器的使用方法和实例
    Java SE 6.0实现高质量桌面集成开发
    苹果App Store开发者帐户从申请,验证,到发布应用(2)
    苹果App Store开发者帐户从申请,验证,到发布应用(1)
  • 原文地址:https://www.cnblogs.com/JanChuJun/p/10146960.html
Copyright © 2011-2022 走看看