匿名函数

匿名函数（英语：Anonymous Function）在计算机编程中是指一类无需定义标识符（函数名）的函数或子程序，普遍存在于多种编程语言中。
1958年LISP首先采用匿名函数，自此之后，越来越多编程语言陆续采用，主流的编程语言如PHP和C++也在不久前采用。

排序

尝试将类按名称排序：
a = [10, '10', 10.0]a.sort(lambda x,y: cmp(x.__class__.__name__, y.__class__.__name__))print a[10.0, 10, '10']
上述 10.0 的类名是“float”，10 的类名是“int”而 '10' 的类名是“str”，排列后的顺序为“float”“int”，接着是“str”。
该示例中的匿名函数就是lambda表达式：
lambda x,y: cmp(...)
该匿名函数接受两个变量x 和 y ，通过内部函数cmp() 返回两者的比较值，下面的例子将按长度为字符串列表排序：
a = ['three', 'two', 'four']a.sort(lambda x,y: cmp(len(x), len(y)))print a['two', 'four', 'three']

Python

Python用lambda语法定义匿名函数，只需用表达式而无需声明
# 以下两种相等同# 1.不使用匿名函数def f(x):
return x * x# 2.使用匿名函数lambda x: x * x

JavaScript

JavaScript支持匿名函数。
alert((function(x){
return x*x;})(10)); // 提示100
小书签也经常使用这种结构，例如下面的一个小书签就将当前网页的标题显示为其URL：
javascript:document.title=location.href;
然而，由于该赋值语句返回了一个值（即URL本身），很多浏览器会同时创建一个新的页面显示这个值。
取而代之，下面的匿名函数就可以做到不返回任何值：
javascript:(function(){document.title=location.href;})();
第一对圆括号中的函数（“(function(){document.title=location.href;})”）用作声明一个匿名函数，而最后的一对圆括号则用来执行这个函数。同等用法有：
javascript:var f = function(){document.title=location.href;}; f();

PHP

PHP 4.0.1之前不支持匿名函数。

4.0.1 至 5.3

PHP 4.0.1新增加了create_function函数，这是匿名函数的雏形。该函数能创建一个随机命名的新函数并以字符串形式返回新函数的函数名。
$foo = create_function('$x', 'return $x*$x;');$bar = create_function("\$x", "return \$x*\$x;");echo $foo(10);
要注意的是，新函数本身及其变量都要放在单引号里面，如果要放在双引号之内，美元符号“$”则需要转码成为“\$”。

5.3

PHP 5.3新增加了Closure类，以及能使类的实例可被调用的“魔术方法”__invoke()。Lambda函数都是编译器的一种“花招”，它能产生新的能被调用的Closure实例，就像函数能被调用一样。
$x = 3;$func = function($z) { return $z *= 2; };echo $func($x); // 输出结果为6
上述例子中的$func是Closure类的一个实例，而echo $func()则相当于是$func->__invoke($z)。PHP 5.3模仿使用匿名函数，但并非支持真匿名函数，因为PHP的函数仍非第一类函数。
虽然PHP 5.3支持闭包，但还需要像这样明确标识其变量：
$x = 3;$func = function() use(&$x) { $x *= 2; };$func();echo $x; // 输出结果为6
$func引用了变量$x（&$x），在调用的时候就会修改原来的$x，其结果在函数以外的地方也是可见的。

C++ 98/03

C++ 98/03标准并不原生支持匿名函数。不过可以利用Boost库的Boost.Lambda来实现一个匿名函数。

C++14

C++14增加了广义捕获(Generalized capture)。即在捕获子句（capture clause）中增加并初始化新的变量，该变量不需要在lambda表达式所处的闭包域（enclosing scope）中存在；即使在闭包域中存在也会被新变量覆盖(override)。新变量类型由它的初始化表达式推导。一个用途是可以从闭包域中捕获只供移动的变量并使用它。
C++14还允许lambda函数的形参使用auto关键字作为其类型，这实质上是函数对象的operator()成员作为模板函数；并且允许可变参数模板。
auto a_lambda_func = [data1=101](int x) { /*...*/ }; //广义捕获，实质上是在函数对象中增加了数据成员data1并初始化auto ptr = std::make_unique<int>(10); //See below for std::make_uniqueauto lambda1 = [ptr = std::move(ptr)] {return *ptr;}
          //大致等效于：   auto lambda2 = [ptr = std::make_unique<int>(10)] {return *ptr;}auto lambda3 = [](auto x, auto y) {return x + y;} //lambda函数的形参类型为autostruct unnamed_lambda                            //这相当于函数对象：{
  template<typename T, typename U>
    auto operator()(T x, U y) const {return x + y;}};auto lambda4 = [](auto&&... params)             //可变参数的函数模板
  {
     return (foo(std::forward<decltype(params)>(params)...));
  }

Visual Basic.NET

匿名函数或lambda表达式即无名的函数或过程，作为表达式的值。可以写为一行或多行。例如：
 Dim func1=Function(i As integer) i+10
 Dim action = sub()
   End Sub
 Dim func2 = Function()
   End Function
可以在声明匿名函数的同时调用它。单行的lambda表达式不能使用Return关键字，其返回类型是自动推导得出；其参数要么都是用As关键字指明类型，要么全部是自动推导出类型。
lambda表达式在定义时可以使用所在上下文（context，即C++语言的闭包closure）的局部变量、参数、属性、Me等等的值，即使lambda表达式离开了定义时所在的context，这些被使用的局部变量等的值仍然有效。这是因为lambda表达式在定义时把所用到的context的值保存到它自己的定义类中。lambda表达式可以嵌套定义。