Tujuannya closures
hanyalah untuk mempertahankan negara; maka nama closure
- itu menutup negara. Untuk memudahkan penjelasan lebih lanjut, saya akan menggunakan Javascript.
Biasanya Anda memiliki fungsi
function sayHello(){
var txt="Hello";
return txt;
}
di mana ruang lingkup variabel terikat pada fungsi ini. Jadi setelah eksekusi, variabel txt
keluar dari cakupan. Tidak ada cara mengakses atau menggunakannya setelah fungsi selesai dieksekusi.
Penutupan adalah konstruk bahasa, yang memungkinkan - seperti yang dikatakan sebelumnya - untuk mempertahankan keadaan variabel dan memperpanjang ruang lingkup.
Ini bisa bermanfaat dalam berbagai kasus. Satu use case adalah pembangunan fungsi tingkat tinggi .
Dalam matematika dan ilmu komputer, fungsi tingkat tinggi (juga bentuk fungsional, fungsional atau functor) adalah fungsi yang melakukan setidaknya satu dari yang berikut: 1
- mengambil satu atau lebih fungsi sebagai input
- menghasilkan suatu fungsi
Contoh sederhana, tapi yang tidak terlalu berguna adalah:
makeadder=function(a){
return function(b){
return a+b;
}
}
add5=makeadder(5);
console.log(add5(10));
Anda mendefinisikan suatu fungsi makedadder
, yang mengambil satu parameter sebagai input dan mengembalikan fungsi . Ada fungsi luarfunction(a){}
dan batin function(b){}{}
. Selanjutnya Anda mendefinisikan (secara implisit) fungsi lain add5
sebagai hasil dari memanggil funtion orde tinggi makeadder
. makeadder(5)
mengembalikan fungsi anonim ( dalam ), yang pada gilirannya mengambil 1 parameter dan mengembalikan jumlah parameter fungsi luar dan parameter fungsi dalam .
The trick adalah, bahwa sementara mengembalikan batin fungsi, yang tidak sebenarnya menambahkan, ruang lingkup parameter dari fungsi luar ( a
) dipertahankan. add5
ingat , bahwa parameternya a
adalah 5
.
Atau untuk menunjukkan setidaknya contoh yang berguna:
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"))));
Penggunaan umum lainnya adalah apa yang disebut IIFE = ekspresi fungsi yang segera dipanggil. Sangat umum dalam javascript untuk memalsukan variabel anggota pribadi. Ini dilakukan melalui fungsi, yang menciptakan ruang lingkup pribadi = closure
, karena langsung setelah definisi dipanggil. Strukturnya adalah function(){}()
. Perhatikan tanda kurung ()
setelah definisi. Ini memungkinkan untuk menggunakannya untuk pembuatan objek dengan pola modul yang terbuka . Triknya adalah membuat ruang lingkup dan mengembalikan objek, yang memiliki akses ke ruang lingkup ini setelah eksekusi IIFE.
Contoh Addi terlihat seperti ini:
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" );
Objek yang dikembalikan memiliki referensi ke fungsi (misalnya publicSetName
), yang pada gilirannya memiliki akses ke variabel "pribadi" privateVar
.
Tapi ini kasus penggunaan yang lebih khusus untuk Javascript.
Apa tugas spesifik yang akan dilakukan oleh seorang programmer yang mungkin paling baik dilayani oleh penutupan?
Ada beberapa alasan untuk itu. Seseorang mungkin, bahwa itu wajar baginya, karena ia mengikuti paradigma fungsional . Atau dalam Javascript: itu hanya keharusan untuk mengandalkan penutupan untuk menghindari beberapa kebiasaan bahasa.