-
Notifications
You must be signed in to change notification settings - Fork 62
/
26_arrow_function.js
157 lines (121 loc) · 3.31 KB
/
26_arrow_function.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
/**
* pada Javscript terbaru, sudah support pembuatan function dengan arrow
*
* tapi arrow function hanya bisa untuk expression atau callback
*/
function test() {
//
}
// function diatas (declaration function) gk bisa dibuatkan versi arrow nya
// function expression
let test2 = function() {
console.log('haloo');
};
test2(); // haloo
// function expression bisa kita buatkan versi Arrow nya
let test3 = () => {
console.log('haloo');
};
test3(); // haloo
// pakai parameter
let test4 = (x, y) => {
return x * y;
};
// bisa juga tanpa kurawal, jika hanya satu statement
test4 = (x, y) => x * y;
// function diats sama dengan
function test4(x, y) {
return x * y;
}
// arrow function juga enak dipake buat callback
setTimeout(() => {
console.log('haloo');
}, 1000);
// contoh lagi
const student = ['Budi', 'Agus'];
student.forEach((item, index) => { // dengan kurawal
console.log(item);
});
let num = [1, 3];
let sum = num.map((item) => item * 2); // tanpa kurawal
console.log(sum); //[2, 6]
let sum2 = num.map((item) => { // pake kurawal karena body nya ada lebih dari 1 statement
console.log(item); // statement 1
return item * 2; // statement 2
});
console.log(sum2); //[2, 6]
/**
* Arrow function tidak punya "this" sendiri. Saat di panggil, maka ia akan mencari this
* sampai ke Enclosing scope/lexical scope nya. Jika ketemu, maka
* this dari Lexial scope nya akan di pake
* -----------------------------------------------------
*/
let user = {
name: "budi",
sayName: function () {
console.log(this); // this ini milik object user
}
};
user.sayName();
// bandingkan dengan arrow function
let user = {
name: "budi",
sayName: () => {
console.log(this); // this ini milik global window object
}
};
user.sayName();
/**
* Arrow function tidak bisa di panggil dengan "new"
* -----------------------------------------------------
*/
const User = (name) => {
this.name = name;
}
new User('Budi'); // TypeError: User is not a constructor
/**
* Arrow function berguna untuk binding this context kedalam Callback
*/
const user = {
name: "Budi",
score: [20, 30, 40],
factor: 2,
printScore: function() {
let res = this.score.map((item) => {
return item * this.factor; // this ini diambil dari Lexical Scope/Enclosing Scope si Arrow function
// ketemu dah..ternyata this nya milik si object user
// ia bakal otomatis nyari si this nya...kalo function biasa mesti kita pake-in bind()
});
return res;
}
};
let c = user.printScore();
console.log(c); // [40, 60, 80]
// tanpa Arrow function kode diatas mesti begini
const user = {
name: "Budi",
score: [20, 30, 40],
factor: 2,
printScore: function() {
let res = this.score.map(function(item) {
return item * this.factor;
}.bind(this));
return res;
}
};
let c = user.printScore();
console.log(c); // [40, 60, 80]
// atau begini (yang lebih baik)
const user = {
name: "Budi",
score: [20, 30, 40],
factor: 2,
printScore: function() {
let res = this.score.map(function(item) {
return item * this.factor;
}.bind({ factor: this.factor }));
return res;
}
};
let c = user.printScore();
console.log(c); // [40, 60, 80]