ปิดมีความสวยงาม! พวกเขาแก้ปัญหาจำนวนมากที่มาพร้อมกับฟังก์ชั่นที่ไม่ระบุชื่อและทำให้โค้ดที่สง่างามเป็นไปได้ (อย่างน้อยตราบใดที่เราพูดถึง php)
ผู้เขียนโปรแกรมจาวาสคริปต์ใช้การปิดตลอดเวลาบางครั้งถึงแม้จะไม่รู้เพราะตัวแปรที่ถูกผูกไว้ไม่ได้กำหนดไว้อย่างชัดเจนนั่นคือสิ่งที่ "ใช้" สำหรับ 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 คืนค่าฟังก์ชันด้วยพารามิเตอร์ที่กำหนดไว้ล่วงหน้า!
พูดตามตรงฉันชอบ php มากขึ้นตั้งแต่ 5.3 และฟังก์ชั่น / ปิดที่ไม่ระบุชื่อ namespaces อาจมีความสำคัญมากขึ้นแต่พวกเขากำลังมากน้อยเซ็กซี่