1 回答

TA貢獻2012條經驗 獲得超12個贊
廣義上來說,匿名函數就是沒有名字的函數,而閉包則是可以感知環境的函數,注意,這里指的環境是定義函數時的環境。
不太同意 @有明 的答案中JS部分的說法,在JS里,閉包不一定是匿名函數,MDN的文檔中指出:
閉包是指那些能夠訪問獨立(自由)變量的函數 (變量在本地使用,但定義在一個封閉的作用域中)。換句話說,這些函數可以“記憶”它被創建時候的環境。
從文檔中舉的第一個例子:
function init() { var name = "Mozilla"; // name是被init創建的局部變量 function displayName() { // displayName()是一個內部函數, alert(name); // 它是一個使用在父函數中聲明的變量的閉包 } displayName(); } init();
可以看到,displayName()
是有名字的,但也是一個閉包。
回到PHP上來,從官方文檔中可以看出,在PHP中閉包和匿名函數可以視為等同的:
匿名函數(Anonymous functions),也叫閉包函數(closures),允許 臨時創建一個沒有指定名稱的函數。
按照Symfony主要作者Fabien Potencier在這篇文章On PHP 5.3, Lambda Functions, and Closures中的說法,PHP中匿名函數和閉包是有區別的:
To sum up, a lambda function is an anonymous PHP function that can be stored in a variable and passed as an argument to other functions or methods. A closure is a lambda function that is aware of its surrounding context.
我的結論是:理論上匿名函數和閉包是不一樣的概念,在PHP中這兩者概念與其他語言(比如JavaScript)是不一樣的,這兩者在使用上可以視為等同的。
至于問題中的關于什么時候使用的疑問,Fabien Potencier的文章中有詳細的例子,建議仔細閱讀。
參考:
添加回答
舉報