폐쇄는 아름답다! 그들은 익명 함수와 함께 제공되는 많은 문제를 해결하고 (최소한 PHP에 대해 이야기하는 한) 정말 우아한 코드를 가능하게합니다.
바인딩 된 변수가 명시 적으로 정의되어 있지 않기 때문에 자바 스크립트 프로그래머는 항상 클로저를 사용합니다.
위의 것보다 더 나은 실제 예가 있습니다. 다차원 배열을 하위 값으로 정렬해야하지만 키가 변경된다고 가정 해 봅시다.
<?php
function generateComparisonFunctionForKey($key) {
return function ($left, $right) use ($key) {
if ($left[$key] == $right[$key])
return 0;
else
return ($left[$key] < $right[$key]) ? -1 : 1;
};
}
$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이 atm이 설치되어 있지 않습니다),하지만 그런 식이어야합니다.
한 가지 단점이 있습니다. 많은 PHP 개발자는 클로저에 직면하면 약간 무력 할 수 있습니다.
클로저의 멋진 점을 더 이해하기 위해 이번에는 자바 스크립트로 다른 예를 들어 보겠습니다. 문제 중 하나는 범위 지정과 브라우저 고유의 비동기 성입니다. 특히 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 value
var myFunction = getFunctionTextInASecond(textToDisplay);
window.setTimeout(myFunction, 1000);
myFunction은 사전 정의 된 일종의 매개 변수가있는 함수를 반환합니다!
솔직히 말하면, 나는 5.3 이후로 PHP와 익명 함수 / 클로저를 훨씬 더 좋아합니다. 네임 스페이스가 더 중요 할 수 있지만 훨씬 덜 섹시 합니다.