闭包:JavaScript,kotlin,Dart对比

很多语言都有闭包的特性,比如JavaScript,kotlin,Dart。虽然语言不同,但是原理特性都差不多,下面来做一下对比

  1. JavaScript

    <script>
        /**
         * 子作用域可以访问父(甚至是祖先)作用域中的变量,而反过来不行
         * 闭包指子函数可以访问外部作用域变量的函数特性,即使在子函数作用域外也可以访问,在函数外部可以读取函数内部的局部变量
         * 如果子函数被使用时父级环境将被保留
         * 函数被执行后其环境变量将从内存中删除
         * 函数每次创建都会创建一个新作用域
         */
    
        function count() {
            let n = 1
            return function () {
                console.log(++n);
            }
        }
    
        let a = count()//子函数
        a()//子函数使用1  打印2
        a()//子函数使用2  打印3
        let m = count()
        m()//1
        m()//2
    
        class User {
            b = 1;
    
            show() {
                console.log(this.b++);
            }
        }
    
        let u = new User()//这个时候class其实也可以写成function 但是必须用new
        u.show()//1
        u.show()//2
        let s = new User()
        s.show()//1
    
    
        let arr = [];
        for (var i = 0; i < 10; i++) {
            arr.push(() => i)//没有闭包
        }
        console.log(arr[3]());//没有闭包,不管是执行第几个元素都会输出10
        let arr1 = []
        for (var i = 0; i < 10; i++) {
            (function (a) {//自行构建闭包
                arr1.push(() => a)
            })(i)//每次push都是在一个函数内执行,每次循环都会创建一个新的作用域
        }
        console.log(arr1[3]());//3
    
        function test(a, b) {
            if (a > b) {
                let t = 3
            } else {
                let t = 2//if和else中的变量互补干扰
            }
        }
    
        (function (a) {
            console.log(a);
        })("自执行函数")
    
    </script>
    
  2. Kotlin

    fun main() {
        { x:String ->
            println(x)
        }("自执行闭包")
        val a = count()
        a()//2
        a()//3
        val u = User()
        u.show()//2
        u.show()//3
    
        val arr = mutableListOf<() -> Int>()
        for (i in 0..10) {
            arr.add(i,fun ():Int{return i})
        }
        println(arr[4]())//4
    
    
    }
    
    fun count(): () -> Unit {
        var a = 1
        return fun() {
            println(++a)
        }
    }
    
    class User{
        var a = 1
        val show = fun (){ println(++a)}
    }
    
  3. Dart

    void main() {
      (x) {
        print(x);
      }("自执行闭包");
    
      var count = () {
        var a = 1;
        return () {
          print(++a);
        };
      };
    
      var a = count();
      a();//2
      a();//3
        
      var p = Person();
      p.increNum();//1
      p.increNum();//2
    }
    class Person{
      var a = 1;
      void increNum(){
        print('${a++}');
    
      }
    }
    
    
    

    一言以蔽之,闭包就是在函数作用域之外,依然能访问函数作用域内的变量(在Dart中叫状态的函数)

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值