forked from teknosains/koleksi-belajar-javascript
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path02_02_basic_javascript_loop.js
More file actions
164 lines (137 loc) · 3.94 KB
/
Copy path02_02_basic_javascript_loop.js
File metadata and controls
164 lines (137 loc) · 3.94 KB
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
/**
* Ada banyak cara buat nge-Loop sesuatu dijavascript
*
* ada:
* - while
* - do while
* - for
* - for-in
* - for-of
*/
/**
* for
* format: for(<init>;<condition>;<update>)
-------------------------------
*/
for (let i = 1; i < 5; i++) {
console.log(i);
}
/**
* Cara kerja for-loop
*
* tahap #1 : inisialisasi let i = 1
* tahap #2 : Cek apakah i < 5, Jika benar maka GOTO #3, Jika salah GOTO #5
* tahap #3 : eksekusi console.log(i);
* tahap #4 : increment i atau i++
* tahap #5 : exit loop
*/
for (let i = 1; i < 5; i++) {
console.log(i); // 1 2 3 4
}
/**
* di internal javascript saat eksekusi Loop diatas nilai dari i sebenarnya sampai 5
* tapi karena ada kondisi i < 5 <=> 5 < 5 <=> false, maka loop-nya berhenti, jadinya
* yang di-output-kan i cuma sampai 4
*/
// kita bisa buktikan dengan pakai "var"
for (var i = 1; i < 5; i++) {
console.log(i); // 1 2 3 4
}
console.log(i); // 5 <--- lihat kan sbnrnya 1 itu sampe 5,
/**
* FOR-IN
*
* berguna untuk nge-Loop Object
*/
let user = {
name: "agus",
age: 30,
sayName: function() {
return 'My name is ' + this.name;
}
};
for (let key in user) {
console.log(key); // name, age
console.log(user[key]); // agus, 30, function() {...}
}
/**
* FOR-OF
*
* berguna untuk nge-loop Array. atau Object lain yang bersifat
* iterable (mempunyai built-in property Symbol.iterator)
*/
let nilai = [1,2,3,4];
for (let x of nilai) {
console.log(x); // 1, 2, 3, 4
}
/**
* Cara ngecek apakah suatu Object itu iterable,
*
* console.dir(obj);
*
* cek di bagian __proto__ apakah ada property Symbol.iterator, jika ada
* maka ia iterable
*/
/**
* Hati menggunakan Loop dengan var untuk apalagi untuk Asyncronous
*/
for (var i = 0; i < 5; i++) {
console.log(i); // 1, 2, 3, 4
}
console.log(i); // 5, <-- ini karena "var" itu hoisted ke lexical scope, makanya
// ia masih bisa di "lihat" diluar loop
// kalao pakai var, dibelakang si Javscrip sbnrnya melakukan ini kepada loop diatas
var i;
for (i = 0; i < 5; i++) {
console.log(i); // 1, 2, 3, 4
}
// lihat bahwa i naik/hoisted ke lexical invironment si for loop
// perilaku seperti ini bisa kampret kalao kita punya operasi Asyncronous di dalam loop
for (var i = 0; i < 5; i++) {
setTimeout(function() {
console.log(i); // 5, 5, 5, 5, 5
});
}
// kok bisa 5 semua, udh gitu 5 kali pula? yaa itu dia karena var itu hoisted,
// lalu ada Ayncron function setTimeout, itu artinya sebelum function callback di
// setTimeout bekerja, si loop-nya udah jalan duluan, pas loop nya udah beres,
// baru dah si timeOut bekerja, tapi udah telat..karena si "i" udh berisi nilai 5
// i=5...makanya hasilnya 5, 5, 5...dst
// Solusinya gimana? pake Apply atau pake let
// pakai apply()
for (var i = 0; i < 5; i++) {
setTimeout(function() {
console.log(i); // 0, 1, 2, 3, 4
}.apply(i));
}
// varian lain klo pakai apply()
for (var i = 0; i < 5; i++) {
setTimeout(function() {
console.log(this); // 0, 1, 2, 3, 4
}.apply(i));
}
for (var i = 0; i < 5; i++) {
setTimeout(function(c) {
console.log(c); // 0, 1, 2, 3, 4
}.apply(null, i));
}
// kalo pakai apply() bisa pakai call() jg bisa dong? iyah bisa
for (var i = 0; i < 5; i++) {
setTimeout(function() {
console.log(i); // 0, 1, 2, 3, 4
}.call(i));
}
// kok bisa pake apply() ? lihat how it works di
// file 34_function_apply_and_call_and_bind.js
// pake bind() bisa ? bisa juga
for (var i = 0; i < 5; i++) {
setTimeout((function() {
console.log(i);
}).bind(i)());
}
// pake let
for (let i = 0; i < 5; i++) {
setTimeout(function() {
console.log(i); // 0, 1, 2, 3, 4
});
}