闭锁很漂亮!它们解决了匿名函数带来的许多问题,并使真正优雅的代码成为可能(至少只要我们谈到php)。
JavaScript程序员总是使用闭包,有时甚至不知道,因为绑定变量没有明确定义-这就是php中的“使用”。
有更好的现实世界的例子比上面的例子。假设您必须按子值对多维数组进行排序,但是关键的变化。<?php function generateComparisonFunctionForKey($key) {
return function ($left, $right) use ($key) {
if ($left[$key] == $right[$key])
return 0;
else
return ($left[$key]
};
}
$myArray = array(
array('name' => 'Alex', 'age' => 70),
array('name' => 'Enrico', 'age' => 25)
);
$sortByName = generateComparisonFunctionForKey('name');
$sortByAge = generateComparisonFunctionForKey('age');
usort($myArray, $sortByName);
usort($myArray, $sortByAge);?>
警告:未经测试的代码(我没有安装php5.3),但应该是这样的。
有一个缺点:如果面对闭包,许多php开发人员可能会感到有些无助。
为了更好地理解闭包的优点,我将给出另一个例子-这次是javascript。问题之一是范围界定和浏览器固有的异步性。特别是,如果说到window.setTimeout();(或间隔)因此,您将一个函数传递给setTimeout,但实际上不能提供任何参数,因为提供参数执行代码!function getFunctionTextInASecond(value) {
return function () {
document.getElementsByName('body')[0].innerHTML = value; // "value" is the bound variable!
}}var textToDisplay = prompt('text to show in a second', 'foo bar');
// this returns a function that sets the bodys innerHTML to the prompted valuevar myFunction = getFunctionTextInASecond(textToDisplay);
window.setTimeout(myFunction, 1000);
myFunction返回带有某种预定义参数的函数!
老实说,自从5.3和匿名函数/闭包之后,我更喜欢php。名称空间可能更重要,但她们不那么性感.