-
Notifications
You must be signed in to change notification settings - Fork 62
/
Copy path16_this.js
155 lines (119 loc) · 3.5 KB
/
16_this.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
/**
* keyword this di Javascript, buat apa ?
* Keyword this sebenarnya adalah property dari sebuah class/Constructor function
*
* this juga sebenarnya adalah sebuah Object. saat kita buat Constructor seperti ini
*/
function Human(name, age) {
this.name = name;
this.age = age;
}
let budi = new Human("Budi", 40);
// dibelakang dia di buatin/define implicit object untuk this
// dia juga buatin implisit return untuk this
function Human(name, age) {
// this = {};
//..
this.name = name;
this.age = age;
//..
// return this;
}
// jika diluar local context, this merujuk ke Global Window Object
// coba aja console.log(this) di browser,
/**
* Pada function biasa, this itu milik global Window Object
*/
function coba() {
console.log(this); // [window Object]
}
coba();
/**
* Kecuali jika function nya kita perlakukan sebagai Constructor
*/
new coba(); // maka "this" nya sekarang milik si coba()
/**
* Spesial kasus ---------------------------------------
*/
let mhs = {
name: "Budi",
age: 20,
matkul: ["C2", "C3", "C4"],
showMatkul() {
console.log(this); // this ini milik si Object mhs
console.log(this.matkul); // array matkul
//sekarang jika kita buat function disini
this.matkul.forEach(function(item, index) {
console.log(this); // this ini milik global window object
// makanya this ini tidak punya akses ke this milik si mhs
// this.name <-- undefined
// this.age <-- undefined
/**
* Kenapa this ini milik gklobal oject? karena pada saat eksekusi,
* callback function ini di eksekusi di Global context, makanya this nya
* itu milik si window global object
*/
});
}
};
mhs.showMatkul();
// solusi masalah diatas ???
// solusi #1 -> assign this ke variable
let mhs = {
name: "Budi",
age: 20,
matkul: ["C2", "C3", "C4"],
showMatkul() {
let _this = this; // assign this, agar this nya bisa diakses oleh function dibawah
//jika kita buat function disini
this.matkul.forEach(function(item, index) {
console.log(_this.name);
console.log(_this.age);
console.log(item);
});
}
};
mhs.showMatkul();
// Solusi #2 -> pake bind
let mhs = {
name: "Budi",
age: 20,
matkul: ["C2", "C3", "C4"],
showMatkul() {
this.matkul.forEach(function(item, index) {
console.log(this.name + ': ' + item);
}.bind(this));
// pake bind, dan kita bind/ikat this milik si object mhs ke function(item, index)
}
};
mhs.showMatkul();
// solusi #3 -> pake Arrow function
let mhs = {
name: "Budi",
age: 20,
matkul: ["C2", "C3", "C4"],
showMatkul() {
this.matkul.forEach((item, index) => {
console.log(this.name + ': ' + item);
});
// arrow function () => {}, otomatis nge-Bind this
}
};
mhs.showMatkul();
// Catatan tambahan
/**
* saat sebuah function di fungsikan sebagai function biasa, maka this nya
* adalah milik global window object. Jika sebuah function difungsikan sebagai
* Constructor function atau Class, maka this nya adalah milik function itu sendiri
* dengan syarat, harus di panggil pakai keyword new
*/
// function biasa
function coba2() {
console.log(this); // ini milik global window object
}
coba();
// function constructor/ class
function Coba() {
console.log(this); // ini milik Coba
}
let c = new Coba();