JavaScript: Kenapa this jadi self ?
Anda mungkin pernah terjumpa kod JavaScript yang mungkin kelihatan seperti berikut:-
app = new App({
newMessage: '',
connect: function() {
var socket = new WebSocket(url);
var self = this;
socket.onmessage = function(msg) {
self.newMessage = msg;
}
}
});
Dan anda tertanya-tanya kenapa perlu ada self = this ?
Ini kerana this dalam function, sekiranya function tersebut dipanggil menggunakan cara invocation biasa seperti getfunctionName(), adalah merujuk kepada global object Window (jika dalam persekitaran browser). Ini mungkin agak kurang intuitif jika anda datang daripada bahasa Java atau PHP di mana this merujuk kepada current instance.
Nilai this ini boleh di’customize’ dengan menggunakan function function.apply. Cara invokasi biasa function:-
doSomething(myName);
Adalah bersamaan dengan:-
doSomething.apply(null, [myName]);
Secara asasnya, sintaks function.apply boleh diringkaskan seperti berikut:-
theFunction.apply(theValueThatWillBecomethis, [theArgumentsToPass])
Dalam contoh di atas, oleh kerana nilai argument yang pertama adalah null, maka this merujuk kepada objek Window. Untuk menukar this kepada nilai yang kita kehendaki, kita boleh memanggil function tadi seperti berikut:-
doSomething.apply(doSomething, [myName]);
Sekarang this adalah merujuk kepada function itu sendiri. Selain itu, penggunaan keyword new juga akan menukar nilai this kepada object kosong {}.
Bagaimana ini menjawab soalan berkaitan self di atas ? Kita rujuk kembali contoh pertama di atas. Dalam function onmessage di atas, kita tidak tahu bagaimana function tersebut akan dipanggil, jadi kita juga tidak tahu apa nilai this dalam function tersebut. Untuk mengekalkan this kepada this yang diluar onmessage, maka kita bind nilai this itu kepada variable baru yang kita namakan self.
Ada yang berpendapat nama self sepatutnya tidak digunakan lagi kerana dalam implementasi yang terkini, nama self turut digunakan sebagai built-in object. Selain self ada yang lebih gemar menggunakan nama that:-
var that = this;
Bagaimana pun ia terpulang kepada anda nama apa yang hendak digunakan.
