闭包——抽象解释的简单注释

总是听说闭包是脚本语言中最难以理解的东西,今天我抽时间对闭包做一个解释,下面是一段百度对闭包的解释:

闭包是可以包含自由(未绑定到特定对象)变量的代码块;这些变量不是在这个代码块内或者任何全局上下文中定义的,而是在定义代码块的环境中定义(局部变量)。“闭包”
一词来源于以下两者的结合:要执行的代码块(由于自由变量被包含在代码块中,这些自由变量以及它们引用的对象没有被释放)和为自由变量提供绑定的计算环境(作用域)。在
Scala、Scheme、Common Lisp、Smalltalk、Groovy、JavaScript、Ruby、 Python和Lua,objective
c 等语言中都能找到对闭包不同程度的支持。

事实上百度已经解释的十分清楚了
,我仅仅是将这一段概念做一个注解。我们通常所谓的闭包函数到底是怎么样子的?首先作为一个函数,它的形式一定时一个函数的形式:

function(){
......
}

其次这个函数内部包含的
是一个变量,而这个变量和对象的变量无关。这样形成了一个含有变量的代码块。你也许会说我擦,这不就是个函数嘛!?别着急对这个函数还有一些特殊的要求:我们要求这个变量不属于代码块,不属于全局变量,而是一个环境变量var,我去,这越来越像一个普通函数了,其实仔细想想没错啊,闭包函数本来就是个函数啊。

不过我们这个时候更应该想到的是脚本的运行机制,通常来书脚本函数在运行之后会释放自己的内存,也就是说每个函数执行完成后,这个函数里的变量就会消失不见,闭包函数就是为了解决这个问题而存在的。闭包要求这个变量不能消失,就是说局部变量是静态的。我该怎么办呢?下面我把这个函数的定义图和实现方法表示出来:

?





1

2

3

4

5

6

7

function(){

    var
不属于代码块,不是全局变量

}

function
f1(){

    function
f2(){闭包变量的位置}

    return
f2;

}

 

这张蓝色的图片表示闭包函数调用的一个过程。这下我们拥有了一个永恒存在的变量,我可以在各个地方调用它,是不是方便了很多呢?至于具体怎么应用那就是你的事情了。

闭包——抽象解释的简单注释,布布扣,bubuko.com

时间: 2024-09-30 14:43:10

闭包——抽象解释的简单注释的相关文章

ADMethodsAccountManagement 一些简单注释添加

using System; using System.Collections; using System.Text; using System.DirectoryServices.AccountManagement; using System.Data; using System.Configuration; /// <summary> /// 添加注释 --Star 2014-05-19 /// </summary> public class ADMethodsAccountMa

Android IOC 之 注解绑定控件 以及事件 事例 代码简单注释讲解

想必开发过android的都使用过一些 框架,然而框架里都会使用一些,注解来帮助我们,节省大量的代码开发量.同时也使代码更加的简洁. 但是注解是通过java反射来实现的当然可能会牺牲掉一些性能. 以下是本人写的一个较为简单的绑定控件,并且触发其OnclickListem 事件. //直接先看下注解方法.比较简单,清晰 public class MainActivity extends FragmentActivity { <span style="white-space:pre"

闭包的讲解与简单实用(重新理解)

//闭包的概念就是函数嵌套函数 内部函数可以调用外部函数的参数和变量 并且变量贮存在内存中 不会被垃圾回收机制销毁//可以手动销毁//下面介绍闭包的介绍和简单使用 //简单写法 function outer(){ var num=0; function inner(){ num++; return num; } return inner; } var num=outer(); alert(num());//1 alert(num());//2 alert(num());//3 num=null;

Python学习笔记之函数作为返回值、闭包的解释

函数作为返回值 高阶函数除了可以接受函数作为参数外,还可以把函数作为结果值返回. 我们来实现一个可变参数的求和.通常情况下,求和的函数是这样定义的: def calc_sum(*args): ax = 0 for n in args: ax = ax + n return ax 但是,如果不需要立刻求和,而是在后面的代码中,根据需要再计算怎么办?可以不返回求和的结果,而是返回求和的函数! def lazy_sum(*args): def sum(): ax = 0 for n in args:

一(3)抽象工厂模式&amp;&amp;简单工厂+反射改进抽象工厂

1 抽象工厂? 抽象工厂用在既有产品树,又有产品族的场合. 产品树:奔驰旗下的跑车和商务车构成产品树 产品族:奔驰旗下的跑车与奥迪旗下的跑车构成产品族./*缺点:此时如果需要增加一个红旗厂家的车,需要改的地方很多.1 定义红旗抽象类,具体类:2 Factory接口增加生产红旗的工厂:3 跑车工厂和商务车工厂都需要实现相应的生产红旗的接口.*//* 优点:当需要使用不同产品时,只需要改一行代码 Factory factory = new SprotCarFactory();,即初始化不同的工厂,就

设计模式——抽象工厂,简单工厂和工厂方法

简单工厂:根据外来参数判断创建的实例.一般使用 If 或者 switch. 工厂方法:项目中只有一个抽像类,只建造一个工厂就可以完成项目. 抽象工厂:项目中不止一个抽象类,需要为每一个类建造一座工厂. 工厂方法是一个特殊的抽象工厂. 在为每一个抽象类建造工厂时,可以直接new出具体的实体产品类,也可以使用反射机制 Type type = Type.GetType("OperatingLibrary.UseTheUnitImplementation", true); UseTheUnit

闭包实例&amp;解释

下面是它的工作原理.每当声明一个新函数并将其赋值给变量时,实际上是保存了函数定义和闭包.闭包包含了创建函数时声明的所有变量,就像一个背包一样--函数定义附带一个小背包.这个背包保存了创建函数时声明的所有变量. 所以我们上面的解释都是错误的,让我们再试一次,但这次是正确的: function createCounter() { let counter = 0 const myFunction = function() { counter = counter + 1 return counter }

eclipse简单注释规范

设置注释模板的入口: Window->Preference->Java->Code Style->Code Template Types/*** @ClassName: ${type_name}* @Description: ${todo}(这里用一句话描述这个类的作用)* @author [email protected]* @date ${date} ${time}** ${tags}*/ Methods/*** @Title: ${enclosing_method}* @De

hibernate简单注释(一)

*****************************hibernate.cfg.xml************************************ <?xml version='1.0' encoding='utf-8'?><!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://www.hibern