什么是闭包

闭包并不是一个很好说明白的概念,看了知乎上大神的解释,总结下


1对象是带方法的数据,而闭包是带数据的方法
后半句的数据特指外部数据

计算机程序可以粗略的分成,代码+数据。初学者很容易就会将这两者对立起来,会认为代码就是代码,数据就是数据,两者是完全不同的。但实际上,两者可以统一起来的。将代码跟数据统一起来,是学习计算机编程的一道门槛。


将数据保存起来,以后再使用,会觉得很自然。但将代码保持起来,以后再使用,很多人会觉得很别扭,难以理解。都是因为还没有过那道槛。


代码指令执行时候,会处于一定的环境,单纯将代码保存下来,还是不够的,需要将代码所处的环境也保存下来。闭包其实是,将代码跟代码所处于的环境做为一个整体来看待。周围的环境,表现为代码所使用的数据。在有些语言中,这个概念叫代码块(block),匿名函数(lambda)等等。


数据跟代码不再人为割裂开来,统一起来看待。闭包就会是很自然的概念。数据可以传递,从一个地方传递到另一个地方,并且以后再使用。闭包从某个角度来说,也是数据,当然也可以传递,从一个函数传递到另一个函数,也可以保持下来,以后再调用。因为将环境也保持下来了,以后调用的时候,就还原当时的情况,延迟执行,就很容易,很自然地实现了。

2,外部数据指的是自由变量

函数也可以有它自身作用域以外的参数参与,这些在函数作用域以外,由函数的外部环境提供的参数就叫“自由变量(Free Variable)


看下面这个Javascript闭包的例子

function Add(y) { 
    return function(x) { 
        return x + y  
    }
} 
对内部函数function(x)来讲,y就是自由变量,而且function(x)的返回值,依赖于这个外部自由变量y。

 


Java内部类是闭包:包含指向外部类的指针

public class Outer {
    private class Inner{

        private x=100;
        public int innerAdd(){
            return x+y;
        }
    }
    private int y=100;
}

能够捕获y,外部变量



你可能感兴趣的:(代码原理)