-
Notifications
You must be signed in to change notification settings - Fork 62
/
Copy path30_closure.js
179 lines (153 loc) · 4.11 KB
/
30_closure.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
/**
* Apa sih Closure? Closure adalah mekanisme di Javascript dimana
* sebuah function bisa mengakses variable di lexical scope
* function parent-nya setelah parent function di definisi dan destroy
*
*
* pusing?
*/
/**
* Global context, lokal context...what the heck?
*/
// myFunction ada di Global context
function myFunction(a) {
// local context
// function dibawah ini ada di local context-nya si myFunction
// jika function dibawah ini di return, makanya nantinya ia akan ada
// di global context
let test = function (b) {
// local context
return a * b;
};
return test;
}
let coba = myFunction(2);
// ini itu sama dengan coba = function test(b) { a * b }
// karena si myFunction() me-return function test()
// dan sekarang, si test() ada di Global context
// contoh
// parent function
function perkalian(a) {
//child function/closure
return function (b) {
return a * b;
}
}
// perkalian basis lima
var kaliLima = perkalian(5); //
/**
* segera setelah kita tulis seperti diatas, function perkalian() dan argumen nya
* di destroy dari memory. dan variable kaliLima sekarang berisi function definition
* hasil return dari function perkalian()
*
* dengan kata lain, dibelakang sebenarnya javascript membuatkan kode sbb:
*
* var kaliLima = function (b) { return a * b; }
*
* artinya sekarang kaliLima akan di eksekusi di Global context,
* dan kalau ada di Global context, artinya mestinya dia tidak punya akses lagi
* ke lexical/local content function parent nya.
*
* silahkan coba console.dir(kaliLima) di browser
*/
kaliSepuluh(10); // 10 x 5 = 50
/**
* Perhatikan bahwa saat kita buat statement
*
* var kaliLima = perkalian(5);
*
* itu sama dengan
*
* var kaliLima = function (b) { return a * b; }
*
* lihat bahwa seharusnya variable a pada statement return a * b; itu undefined,
* karena a sudah tidak ada kan? lihat deh sekali lagi statement ini
*
* var kaliLima = function (b) { return a * b; }
*
* variable a tidak ada referensinya, tapi ternyata saat kita panggil begini
*
* kaliSepuluh(10); itu hasilnya valid dan tidak error..kenapa kok bisa?
* kan variable a tidak punya referensi lagi? Nah ternyata variable a itu masih ada..
* hanya saja sekarang lokasinya sudah di pindahin sama Javascript, yaitu sekarang lokasinya
* ada di Scope Closure
*
* jadi Javascript akan membuatkan property Closure bagi var kaliLima yang isinya a: 5
*
* Closure: { a: 5 }, dan Closure ini bisa diakses oleh function kaliLima
*/
function perkalian(a) {
return function (b) {
return a * b;
}
}
/**
* Fungsi diatas itu artinya Closure: {a: [argumen value]}
*
* bagaimana jika function nya begini
*
*
*/
function perkalian(a) {
var x = 3;
var y = 5;
return function (b) {
return a * b * x * y;
}
}
//kali basis 7
var kaliBebas = perkalian(7);
kaliBebas(4);
/**
* Apa isi Closure nya? yaap Closurenya adalah
* {
* a: 7
* x: 3
* y: 5
* }
*
* jadi kaliBebas(4) sama dengan : return 7 x 4 x 3 x 5;
*
* Contoh lagi
*/
function sayName(name) {
var prefix = 'My Name is ';
return function (gelar) {
return prefix + name + gelar;
}
}
var agus = sayName('Agus');
var sayAgus = agus('S.kom');
console.log(sayAgus); // My Name is Agus S.kom
/**
* Apa Closure dari function diatas? yaap
* Closure: {
* name: 'Agus',
* prefix: 'My Name is'
* }
*/
/**
* Anjuran Closure
* 1. Jangan panggil/gunakan closure didalam Loop
* 2. Jangan panggil closure didalam Class/Constructor Function
*/
function Human(name) {
this.name = name;
// ini sbnrnya closure
this.sayName = function() {
return this.name;
}
}
/**
* Jika menulis kode seperti diatas, maka setiap kali Human() di instanisasi
* var budi = new Human('budi');
* var agus = new Human('agus);
*
* maka function sayName() akan terus di re-assign oleh Javascript engine, jadinya gk bagus
* buat performace.
*
* maka smestinya kita buatkan method di prototype saja
*/
Human.prototype.sayName = function() {
return this.name;
};