วัตถุประสงค์ของการclosures
เป็นเพียงเพื่อรักษาสถานะ; ดังนั้นชื่อclosure
- มันปิดเหนือรัฐ เพื่อความสะดวกในการอธิบายเพิ่มเติมฉันจะใช้ Javascript
โดยทั่วไปคุณมีฟังก์ชั่น
function sayHello(){
var txt="Hello";
return txt;
}
โดยขอบเขตของตัวแปรถูกผูกไว้กับฟังก์ชันนี้ ดังนั้นหลังจากการดำเนินการตัวแปรtxt
ออกไปนอกขอบเขต ไม่มีวิธีการเข้าถึงหรือใช้งานหลังจากฟังก์ชั่นเสร็จสิ้นการดำเนินการ
การปิดคือโครงสร้างของภาษาซึ่งอนุญาตให้ - ดังที่ได้กล่าวไว้ก่อนหน้า - เพื่อรักษาสถานะของตัวแปรและขยายขอบเขต
สิ่งนี้อาจมีประโยชน์ในหลายกรณี กรณีการใช้งานหนึ่งคือการก่อสร้างของฟังก์ชั่นการสั่งซื้อที่สูงขึ้น
ในวิชาคณิตศาสตร์และวิทยาการคอมพิวเตอร์ฟังก์ชันลำดับสูงกว่า (เช่นรูปแบบการใช้งานหน้าที่หรือ functor) เป็นฟังก์ชันที่ทำอย่างน้อยหนึ่งอย่างต่อไปนี้: 1
- รับฟังก์ชั่นหนึ่งอย่างหรือมากกว่านั้นเป็นอินพุต
- ส่งออกฟังก์ชั่น
ตัวอย่างที่เรียบง่าย แต่ไม่ได้มีประโยชน์มากเกินไปคือ:
makeadder=function(a){
return function(b){
return a+b;
}
}
add5=makeadder(5);
console.log(add5(10));
คุณกำหนดฟังก์ชั่นmakedadder
ซึ่งจะใช้เวลาหนึ่งพารามิเตอร์เป็น input และผลตอบแทนการทำงาน มีความเป็นนอกฟังก์ชั่นfunction(a){}
และภายใน function(b){}{}
.Further คุณกำหนด (implicitely) ฟังก์ชั่นอื่นadd5
เป็นผลมาจากการเรียก makeadder
funtion makeadder(5)
ส่งคืนฟังก์ชั่นไม่ระบุชื่อ ( ภายใน ) ซึ่งจะใช้เวลา 1 พารามิเตอร์และส่งกลับผลรวมของพารามิเตอร์ของฟังก์ชั่นด้านนอกและพารามิเตอร์ของฟังก์ชั่นภายใน
เคล็ดลับคือว่าในขณะที่กลับมาภายในฟังก์ชั่นที่ไม่เกิดขึ้นจริงเพิ่มขอบเขตของพารามิเตอร์ของฟังก์ชั่นด้านนอก (คนa
) จะถูกเก็บรักษาไว้ add5
จำได้ว่าพารามิเตอร์เป็นa
5
หรือเพื่อแสดงตัวอย่างที่มีประโยชน์อย่างน้อยหนึ่งตัวอย่าง:
makeTag=function(openTag, closeTag){
return function(content){
return openTag +content +closeTag;
}
}
table=makeTag("<table>","</table>")
tr=makeTag("<tr>", "</tr>");
td=makeTag("<td>","</td>");
console.log(table(tr(td("I am a Row"))));
อีก usecase ทั่วไปคือIIFE = เรียกใช้การแสดงออกของฟังก์ชั่นทันที มันเป็นเรื่องธรรมดามากในจาวาสคริปต์เพื่อปลอมตัวแปรสมาชิกส่วนตัว สิ่งนี้ทำผ่านฟังก์ชั่นซึ่งสร้างprivate scope = closure
เนื่องจากเป็นทันทีหลังจากการเรียกใช้นิยาม function(){}()
โครงสร้าง สังเกตเครื่องหมายวงเล็บ()
หลังคำจำกัดความ นี้จะทำให้มันเป็นไปได้ที่จะใช้สำหรับการสร้างวัตถุที่มีการเปิดเผยรูปแบบโมดูล เคล็ดลับคือการสร้างขอบเขตและส่งคืนวัตถุซึ่งสามารถเข้าถึงขอบเขตนี้ได้หลังจากการดำเนินการของ IIFE
ตัวอย่างของ Addi มีลักษณะเช่นนี้:
var myRevealingModule = (function () {
var privateVar = "Ben Cherry",
publicVar = "Hey there!";
function privateFunction() {
console.log( "Name:" + privateVar );
}
function publicSetName( strName ) {
privateVar = strName;
}
function publicGetName() {
privateFunction();
}
// Reveal public pointers to
// private functions and properties
return {
setName: publicSetName,
greeting: publicVar,
getName: publicGetName
};
})();
myRevealingModule.setName( "Paul Kinlan" );
วัตถุกลับมีการอ้างอิงถึงฟังก์ชั่น (เช่นpublicSetName
) privateVar
ซึ่งจะมีการเข้าถึงตัวแปร
แต่นี่เป็นกรณีการใช้งานพิเศษสำหรับ Javascript
โปรแกรมเมอร์คนใดที่จะทำหน้าที่เฉพาะเจาะจงซึ่งอาจได้รับผลงานที่ดีที่สุดโดยการปิดงาน?
มีสาเหตุหลายประการ หนึ่งอาจจะเป็นไปได้ว่ามันเป็นธรรมชาติสำหรับเขาเพราะเขาเป็นไปตามกระบวนทัศน์การทำงาน หรือใน Javascript: มันเป็นเพียงความจำเป็นต้องพึ่งพาการปิดเพื่อหลีกเลี่ยงนิสัยใจคอของภาษา