闭包(Closure)和匿名函数(Anonymous function)/lambda表达式的区别

闭包(Closure)和匿名函数(Anonymous function)/lambda表达式的区别

函数最常见的形式是具名函数(named function):

function foo(){
    console.log("named function")
}
foo()

不过也可以将函数视作数据赋值给变量,这样的函数可以没有名字:

nameless = function(){
    console.log("anonymouse function")
}

nameless()

上面的function(){...}就是匿名函数(anonymous function),这个匿名函数也叫做lambda表达式,即lambda表达式就是匿名函数。

而闭包(closure)是作用域在一个环境内闭合的函数,举个例子:

function outer(){
    var a = 10;
    function inner(){
        console.log(a);
    };
    return inner;
}
outer()()

这里的inner函数作用域位于outer函数作用域(环境/上下文)内,即闭合于outer环境,这个inner就是闭包。闭包可以具名也可以匿名,上面是具名的形式,可能在很多编程语言无法实现,也可以使用下面的匿名形式:

function outer(){
    var a = 10;
    return function inner(){
        console.log(a);
    };
}
outer()()

所以两个是不相同但是相关的概念,总结来说:

  • lambda是没有名字的函数,等价于匿名函数
  • 闭包是作用域闭合于外部函数环境的函数

原文地址:https://www.cnblogs.com/racaljk/p/10331551.html

时间: 2024-11-05 02:17:29

闭包(Closure)和匿名函数(Anonymous function)/lambda表达式的区别的相关文章

PythonStudy——匿名函数 Anonymous function

def fn(*args, **kwargs): # 函数体 return '返回值' # 匿名函数:# 1.匿名函数没有函数名# 2.匿名函数的关键字采用lambda# 3.关键字 lambda 与标识函数功能体 : 之间一定是参数,所以省略()# 4.匿名还是没有函数体,只有返回值,所以函数体和返回值的return关键字都省略了 lambda *args, **kwargs: '返回值' # 注意:# 1.参数的使用和有名函数一样,六种形参都支持# 2.返回值必须明确成一个值,可以为单个值对

转载 C#匿名函数 委托和Lambda表达式

转载原出处: http://blog.csdn.net/honantic/article/details/46331875 匿名函数 匿名函数(Anonymous Function)是表示“内联”方法定义的表达式.匿名函数本身及其内部没有值或者类型,但是可以转换为兼容的委托或者表达式树类型(了解详情).匿名函数转换的计算取决于转换的目标类型:如果是委托类型,则转换计算为引用匿名函数所定义的方法的委托:如果是表达式树类型,则转换将计算以对象结构形式表示方法结构的表达式树.  匿名函数有两种语法风格

STL函数对象和Lambda表达式

1.基本概念 Function object是定义了operator()的object. FunctionObjectType fo; fo(…);调用函数对象的operator()代替函数fo()的调用. 等价于:fo.operator()(…); 函数对象的三个好处: (1) 函数对象可以有自己的状态,因此可能是更聪明的.你可以拥有同一个函数对象的两个实例,它们可能有不同的状态. (2) 每个函数对象是一个类型.你可以把函数对象作为模版的参数用于指定一个特定的行为. (3)函数对象通常比函数

C++ 理解函数对象与lambda表达式

参考<21天学通C++>第21与第22章节,对函数对象进行介绍,同时通过lambda表达式这一匿名函数对象的简洁方式加深对函数对象的理解.本篇博文的主要内容是: (1) 函数对象的概念: (2) 将函数对象用作谓词: (3) 如何使用函数对象实现一元.二元谓词: (4) 如何编写lambda表达式: (5) 如何将lambda表达式用作谓词: (6) 如何编写可存储和可操作状态的lambda表达式. 一. 函数对象 1. 函数对象的概念和种类 函数对象是C++实体,从概念上讲,函数对象是用作函

JavaScript 闭包系列二 --- 匿名函数及函数的闭包

一. 匿名函数 1. 函数的定义,可分为三种 1) 函数声明方式 function double(x) {    return 2*x;} 2)Function构造函数,把参数列表和函数体都作为字符串,不方便,不建议使用 var double = new Function('x', 'return 2*x;'); 3)函数表达式方式 var double = function(x) {    return 2*x;} 该形式中,等号右边是一个匿名函数,创建函数完毕后,将该函数赋给了变量doubl

js匿名函数,(function(){}())

今天查看jQuery UI 源码的时候,突然发现源码头部的代码: 后面,了解了下,原来是一种匿名函数.将后面的()里的代码传入前面function里的参数中,并且立即执行. 书写方式:(function(){}()) 或者 (function(){})() 例子: 1 (function(a){ 2 console.log(a()); 3 }(function(){ 4 return 2; 5 })) //输出 2

&lt;JAVA8新增内容&gt;关于匿名内部集合和lambda表达式

要想说清楚JAVA中的Lambda表达式,必须想讲一下匿名内部类来帮助理解本质. 一.匿名内部类 匿名内部类适合创建那种只需要一次使用的类,例如前面介绍命令模式时所需要的Command对象,匿名内部类的语法有点奇怪,创建匿名内部类时会立即创建一个该类的实例,这个类的定义立即消失,匿名内部类不能重复使用. 语法格式一般如下: new 实现接口() | 父类构造器 (实参列表){ //匿名内部类的类体部分 } 从上面可以看出,匿名内部类必须继承一个父类,或者实现一个接口,但最多只能继承一个父类,或者

多播委托和匿名方法再加上Lambda表达式

多播委托就是好几个方法全都委托给一个委托变量 代码: 1 namespace 委托 2 { 3 class Program 4 { 5 static void math1() 6 { 7 Console.WriteLine("这是第一个方法"); 8 } 9 10 static void math2() 11 { 12 Console.WriteLine("这是第二个方法"); 13 } 14 15 static void Main(string[] args) 1

委托的实现匿名函数和朗姆达表达式

**委托(delegate):一个表示方法的数据类型.间接派生于System.Delegate 委托是一个引用类型,但不必用new来实例化它.直接传递名称,而不是现实实例化.这是c#2.0开始支持的一个新语法,成为委托推断(delegate inference) 1 namespace delegateEx 2 { 3 //委托声明 4 public delegate bool ComparisonHandler(int first,int second); 5 6 public static