匿名函数

匿名函式（英語：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表達式可以巢狀定義。