闭包

闭包

这篇文章的启蒙来自与对闭包问题的求解时看的一个知乎回答:闭包(计算机科学)是什么?

javascript中的闭包

talk is cheap show me the code ,所以先来看个例子

    int y=3;
    function A(){
        int x=2;
        return x+y;
    }

写js代码时我们很自然的就是这么写。但是如果是c语言呢

    int A();
    void main(){
    int y=3;
        A();
    }
    int A(){
        int x=2;
        return x+y;
    }

这样肯定会报错,我们一般会这样写

    int A();
    void main(){
    int y=3;
        A(y);
    }
    int A(y){
        int x=2;
        return x+y;
    }

这样写就没错了,但是这样就不是闭包了。因为传参的时候参数实际上是把外部的作用域变量的值复制给本作用域变量,也就是参数也是本作用域定义的一个变量。从这里的区别,能看出要形成闭包,我们必须要使用不是本作用域内定义的变量。javascript允许使用“外面”作用域的变量。原理可以看javascript高级程序设计这本书。所以闭包的概念就是使用不是本作用域的变量,可能这不是很严谨,但是能总体概括成这句话。

java中的闭包

接下来看看其他语言的闭包来加深对闭包的理解。

    public class A{
        public int y;
        public int fn(){
            int x=2;
            return x+y;
        }
        public static void main(String[] args){
                fn();       
        }
    }

这里就存在闭包了,因为y不是fn函数的局部变量。y不是传参复制给fn的局部变量的。这里y不是fn的局部变量,那么为什么能被访问呢,其实实际调用应该是这样的 return x+this.y; this是指向对象实例的指针。

扩展

上面已经能大概的概括出闭包的概念了,但是还可以更深理解闭包,那么可以了解函数压栈,栈内存和堆内存。接下来是我自己的总结,不能保证正确,但以后学习更多的知识会来更新自己的总结。

  • 栈内存和堆内存
    栈内存存放由操作系统分配的静态内存,函数的局部变量就保存在里面。
    堆内存则存放由代码申请的内存的,c语言是malloc(sizeof(int)*6),然而我们new对象时也调用了malloc函数,所以对象是存放在堆内存中的。关于栈内存和堆内存可以看看这篇博客
  • 函数压栈
    当我们调用函数的时候,我们会在栈内存开辟一段内存出来给我们保存我们的局部变量和返回地址等其他数据。局部变量就包括参数和在函数中定义的变量,所以当我们执行函数里面的代码时这些变量就能够被找到。当执行完函数,这段内存会被出栈,就是没有指针指向它了,就找不到了。那么this.y是如何被找到的呢,它不是局部变量(参数或函数内定义的变量),所以那段栈内存是没有保存y的值。确实是没有保存y的值,但是那段栈内存保存了this指针(这一点是自己的推测),通过this指针能够找到存在堆内存的A的对象实例,自然能找到找实例中的y。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值