Masukkan Password
34 Deklarasi Variabel menggunakan Var
Lecture ini membahas var, yaitu cara lama membuat variable di JavaScript sebelum ES6/ES2015 memperkenalkan let dan const.
Ini penting karena meskipun sekarang kita biasanya memakai let dan const, kamu masih akan sering menemukan var ketika membaca kode JavaScript lama.
Lecture ini fokus pada 3 perbedaan utama var dengan let/const:
- Scope
- Re-declaration / reassignment
- Hoisting
Kita bahas satu per satu dengan contoh sederhana.
1. Apa itu var?
Sebelum ES6/ES2015, JavaScript belum memiliki:
let
const
Cara utama membuat variable adalah:
var
Contoh:
var x = 100;
console.log(x);
Output:
100
Sama seperti let, kita juga bisa membuat variable terlebih dahulu kemudian memberikan nilainya:
var x;
x = 100;
console.log(x);
Ini juga valid.
2. var bisa menyimpan berbagai jenis data
Sama seperti let, variable dengan var bisa menyimpan berbagai tipe data.
Misalnya:
var name = "John";
var age = 20;
var isStudent = true;
var user = null;
Dan karena JavaScript bersifat dynamically typed, kita juga bisa mengganti tipe nilainya:
var x = 100;
x = "Hello";
console.log(x);
Output:
Hello
Jadi dalam hal ini var mirip dengan let.
3. var vs const
Pertama kita lihat const.
const x = 100;
Kemudian:
x = 200;
โ Error.
Karena const tidak boleh di-reassign.
Sedangkan:
var x = 100;
x = 200;
โ Boleh.
Jadi:
var
โ
nilai boleh diganti
let
โ
nilai boleh diganti
const
โ
binding tidak boleh di-reassign
Contoh:
var x = 100;
x = 200;
let y = 100;
y = 200;
const z = 100;
z = 200; // โ Error
Jadi dalam hal reassignment, var mirip dengan let.
4. Tapi var berbeda jauh dari let dalam hal scope
Ini adalah perbedaan yang sangat penting.
Lecture mengatakan:
varmemiliki function scope.
Sedangkan:
letdanconstmemiliki block scope.
Untuk memahami ini, kita harus ingat dulu apa itu scope.
5. Ingat kembali konsep scope
Scope adalah:
wilayah di mana sebuah variable bisa diakses.
Misalnya:
function greetings() {
var name = "John";
console.log(name);
}
name dibuat di dalam function.
Jadi:
function greetings()
โโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ โ
โ var name = "John"; โ
โ โ
โ console.log(name); โ
โ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโ
name bisa digunakan di dalam function tersebut.
6. Apa itu block?
Block adalah bagian kode yang dibungkus dengan:
{
...
}
Contoh:
if (true) {
// ini adalah block
}
Loop juga mempunyai block:
for (let i = 0; i < 10; i++) {
// ini juga block
}
Function juga memiliki {}, tetapi dalam pembahasan scope kita perlu membedakan function scope dan block scope.
7. let memiliki block scope
Contoh:
if (true) {
let x = 100;
console.log(x);
}
Ini boleh.
Output:
100
Tetapi:
if (true) {
let x = 100;
}
console.log(x);
โ Error.
Kenapa?
Karena x hanya hidup di dalam block if.
Gambarnya:
GLOBAL
โ
โ
โโโ if block
โ โ
โ โโโ let x
โ
โโโ console.log(x) โ
x tidak bisa keluar dari block.
8. var berbeda
Sekarang:
if (true) {
var x = 100;
}
console.log(x);
Output:
100
๐ฎ
Kenapa?
Karena var tidak memiliki block scope seperti let.
var memiliki function scope.
Kalau kode tersebut tidak berada di dalam function, var tidak terkurung oleh block if.
9. Contoh yang sama supaya lebih jelas
Dengan let
if (true) {
let x = 100;
}
console.log(x);
Hasil:
ReferenceError
Karena:
x hanya ada di dalam block
Dengan var
if (true) {
var x = 100;
}
console.log(x);
Hasil:
100
Karena:
var mengikuti function scope,
bukan block scope.
10. Contoh dari lecture
Misalnya:
function greetings() {
var x = 10;
if (x < 100) {
var y = 100;
let z = 200;
}
console.log(y);
console.log(z);
}
Apa yang terjadi?
y dibuat menggunakan:
var y = 100;
Sedangkan z:
let z = 200;
Karena y menggunakan var, y bisa diakses dari bagian lain di function yang sama.
Jadi:
console.log(y);
โ Bisa.
Tetapi:
console.log(z);
โ Tidak bisa.
Karena z menggunakan let dan hanya berlaku di block if.
11. Visualisasi scope-nya
function greetings()
โ
โโโ var x
โ
โโโ if block
โ
โโโ var y
โ
โโโ let z
Untuk var y:
function greetings
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ var y = 100; โ
โ โ
โ if (...) { โ
โ var y = 100; โ
โ } โ
โ โ
โ console.log(y); โ
โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
Karena var mengikuti function scope.
Sedangkan let z:
function greetings
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ โ
โ if (...) { โ
โ let z = 200; โ
โ } โ
โ โ
โ console.log(z); โ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
Karena z hanya berada di block if.
12. Analogi scope yang mudah
Bayangkan sebuah rumah.
Rumah
โ
โโโ ruang tamu
โโโ kamar
โโโ dapur
let/const seperti barang yang hanya boleh digunakan di ruangan tertentu.
Misalnya:
let laptop
diletakkan di kamar.
Maka:
“Laptop ini hanya tersedia di kamar.”
Sedangkan var dalam function scope lebih seperti barang yang tersedia sepanjang rumah tersebut.
Jadi:
function = rumah
block = ruangan
var:
“Selama masih di rumah/function yang sama, saya bisa diakses.”
let/const:
“Saya hanya bisa digunakan di ruangan/block tempat saya dibuat.”
13. Perbedaan kedua: re-declaration
Sekarang kita masuk ke perbedaan kedua.
Re-declaration berarti:
membuat/deklarasi ulang variable dengan nama yang sama dalam scope yang sama.
Dengan var, ini diperbolehkan.
Contoh:
var x = 100;
var x = "Hello";
console.log(x);
Tidak error.
Output:
Hello
14. Apa yang terjadi?
Pertama:
var x = 100;
Kemudian:
var x = "Hello";
Variable x sekarang memiliki nilai terbaru:
x โ "Hello"
Jadi:
console.log(x);
menghasilkan:
Hello
15. let tidak boleh di-redeclare
Sekarang:
let x = 100;
let x = "Hello";
โ Error.
Biasanya error-nya seperti:
Identifier 'x' has already been declared
Artinya:
“Variable bernama
xsudah pernah dideklarasikan.”
16. Jangan tertukar antara re-declaration dan reassignment
Ini penting sekali.
Reassignment
Variable sudah dibuat, lalu nilainya diganti.
let x = 100;
x = 200;
โ Boleh.
Re-declaration
Variable dibuat lagi dengan keyword deklarasi:
let x = 100;
let x = 200;
โ Tidak boleh dalam scope yang sama.
Jadi:
let x = 100;
x = 200;
= reassignment โ
Sedangkan:
let x = 100;
let x = 200;
= re-declaration โ
17. Bagaimana dengan const?
const juga tidak boleh di-redeclare dalam scope yang sama.
const x = 100;
const x = 200;
โ Error.
Dan tentu:
const x = 100;
x = 200;
โ juga error karena const tidak boleh di-reassign.
18. Bahkan var dan let tidak bisa dicampur sembarangan
Lecture memberikan contoh:
var x = 100;
let x = 200;
โ Error.
Begitu juga:
let x = 100;
var x = 200;
โ Error.
Kenapa?
Karena dalam scope yang sama, identifier x sudah digunakan.
Jadi meskipun var sendiri memperbolehkan redeclaration:
var x = 100;
var x = 200;
itu bukan berarti var boleh bertabrakan dengan let atau const.
19. Ringkasan bagian re-declaration
| Kode | Boleh? |
|---|---|
var x = 1; var x = 2; | โ |
let x = 1; let x = 2; | โ |
const x = 1; const x = 2; | โ |
var x = 1; let x = 2; | โ |
let x = 1; var x = 2; | โ |
let x = 1; x = 2; | โ |
const x = 1; x = 2; | โ |
20. Kenapa var memperbolehkan hal seperti ini?
Ini salah satu alasan mengapa var sering dianggap memiliki perilaku yang lebih berisiko.
Bayangkan programmer menulis:
var username = "John";
Beberapa ratus baris kemudian:
var username = "Mark";
JavaScript lama bisa menerima ini.
Akibatnya variable yang sebelumnya berisi "John" sekarang berubah menjadi "Mark".
Dalam project besar, hal seperti ini bisa membuat kode lebih sulit diprediksi.
let dan const memberikan aturan yang lebih ketat sehingga kesalahan seperti ini lebih mudah terdeteksi.
21. Perbedaan ketiga: hoisting
Nah, ini bagian yang paling membingungkan untuk pemula.
Lecture juga mengatakan bahwa hoisting akan dibahas lebih detail nanti, jadi untuk sekarang cukup pahami konsep dasarnya.
Hoisting secara sederhana adalah perilaku JavaScript di mana deklarasi tertentu diproses sebelum kode dieksekusi sesuai aturan bahasa.
Untuk var, deklarasinya dapat diakses sebelum baris deklarasinya muncul, tetapi nilainya pada saat itu adalah:
undefined
Contoh:
console.log(x);
var x = 100;
Hasil:
undefined
Bukan:
100
dan bukan error ReferenceError.
22. Kenapa hasilnya undefined?
Secara sederhana, JavaScript memperlakukan deklarasi var seolah-olah sudah tersedia lebih awal, tetapi assignment-nya belum terjadi.
Kode:
console.log(x);
var x = 100;
bisa dibayangkan secara sederhana seperti:
var x;
console.log(x);
x = 100;
Maka ketika:
console.log(x);
dijalankan, x sudah ada tetapi belum mendapatkan nilai:
x = undefined
Setelah itu:
x = 100;
baru nilainya menjadi 100.
Catatan: ini adalah model mental sederhana untuk memahami hoisting, bukan transformasi literal yang dilakukan engine.
23. Bandingkan dengan let
Sekarang:
console.log(x);
let x = 100;
โ Error.
Biasanya:
ReferenceError:
Cannot access 'x' before initialization
Dengan const juga:
console.log(x);
const x = 100;
โ Error.
24. Jadi bagaimana perbandingannya?
var
โ
bisa diakses sebelum deklarasi
โ
hasilnya undefined
Sedangkan:
let / const
โ
tidak boleh diakses sebelum deklarasi/inisialisasi
โ
ReferenceError
Contoh:
var
console.log(x);
var x = 100;
Output:
undefined
let
console.log(x);
let x = 100;
Output:
ReferenceError
const
console.log(x);
const x = 100;
Output:
ReferenceError
25. Tapi jangan simpulkan “let dan const tidak di-hoist”
Ini sedikit nuansa penting.
Untuk level lecture ini, kamu boleh mengingat:
“
varbisa diakses sebelum deklarasi, sedangkanlet/consttidak.”
Tetapi secara teknis, mengatakan “let dan const tidak di-hoist sama sekali” kurang tepat.
let dan const juga mengalami proses deklarasi pada fase awal eksekusi, tetapi identifier tersebut berada dalam Temporal Dead Zone (TDZ) sampai mencapai deklarasinya.
Akibatnya:
console.log(x);
let x = 100;
menghasilkan:
ReferenceError
Untuk sekarang cukup ingat:
var โ sebelum deklarasi: undefined
let โ sebelum deklarasi: ReferenceError
const โ sebelum deklarasi: ReferenceError
Nanti ketika lecture membahas hoisting dan TDZ, konsep ini akan lebih jelas.
26. Tiga perbedaan utama
Sekarang kita satukan semuanya.
| Fitur | var | let | const |
|---|---|---|---|
| Bisa reassign | โ | โ | โ |
| Bisa redeclare di scope yang sama | โ | โ | โ |
| Scope | Function | Block | Block |
| Akses sebelum deklarasi | undefined | โ ReferenceError | โ ReferenceError |
Ini adalah tabel yang sangat bagus untuk kamu simpan.
27. Contoh lengkap
Mari lihat ketiga keyword sekaligus:
function test() {
var a = 10;
let b = 20;
const c = 30;
if (true) {
var x = 100;
let y = 200;
const z = 300;
}
console.log(x); // 100
console.log(y); // ReferenceError
console.log(z); // ReferenceError
}
Kenapa?
Karena:
var x
โ
function scope
โ
bisa keluar dari if
Sedangkan:
let y
const z
โ
block scope
โ
tidak bisa keluar dari if
28. var bukan berarti “tidak punya scope”
Ini kesalahpahaman yang sering muncul.
โ Jangan berpikir:
“
vartidak punya scope.”
Yang benar:
varmemiliki function scope.
Contoh:
function test() {
var x = 100;
}
console.log(x);
โ Error.
Kenapa?
Karena x berada di function test.
Jadi var tetap memiliki batas scope.
29. var di dalam if vs di dalam function
Perhatikan dua contoh berikut.
var di dalam if
if (true) {
var x = 100;
}
console.log(x);
โ Bisa.
Karena if hanya merupakan block, bukan function.
var di dalam function
function test() {
var x = 100;
}
console.log(x);
โ Tidak bisa.
Karena function menciptakan function scope.
Visual:
GLOBAL
โ
โโโ if block
โ โโโ var x
โ
โโโ x masih bisa diakses
Sedangkan:
GLOBAL
โ
โโโ function test()
โ
โโโ var x
โ
hanya di sini
30. Kenapa let dan const lebih aman?
Bayangkan kode:
if (userIsLoggedIn) {
let message = "Welcome";
}
message hanya diperlukan di dalam if.
Dengan let, scope-nya otomatis dibatasi:
if block
โโโโโโโโโโโโโโโโโโโโ
โ let message โ
โ โ
โโโโโโโโโโโโโโโโโโโโ
Kode di luar tidak bisa mengaksesnya.
Ini membantu mencegah variable “bocor” ke bagian kode yang tidak membutuhkannya.
Karena itu JavaScript modern lebih sering menggunakan:
const
dan:
let
daripada:
var
31. Lalu kapan kita menggunakan var?
Dalam JavaScript modern, biasanya:
Gunakan
constsebagai default.
Kalau nilainya memang perlu diganti:
let
Sedangkan:
var
biasanya digunakan ketika:
- membaca codebase JavaScript lama
- memahami tutorial/kode legacy
- mempertahankan kode lama yang memang menggunakan
var
Untuk code baru, umumnya tidak ada alasan kuat bagi pemula untuk memilih var daripada let/const.
32. Hubungkan dengan lecture sebelumnya
Sebelumnya kita belajar:
let username = "John";
dan:
const age = 20;
Sekarang kita tahu kenapa let dan const diperkenalkan di ES6.
Sebelum ES6:
var username = "John";
adalah cara utama membuat variable.
Setelah ES6:
let username = "John";
const age = 20;
memberikan cara yang lebih aman dan lebih jelas.
Terutama karena:
var
โโโ function scope
โโโ boleh redeclare
โโโ hoisting โ undefined
let
โโโ block scope
โโโ tidak boleh redeclare
โโโ sebelum deklarasi โ ReferenceError
const
โโโ block scope
โโโ tidak boleh redeclare
โโโ tidak boleh reassign
โโโ sebelum deklarasi โ ReferenceError
33. Cara mengingatnya dengan analogi
Bayangkan ada tiga orang:
var = orang lama ๐
Dia cukup bebas:
"Taruh aku di function,
aku bisa keliling block di dalamnya."
"Namaku sudah dipakai?
Tidak masalah, declare lagi."
"Belum sampai deklarasi?
Aku ada kok, nilainya undefined."
let = lebih disiplin
"Aku hanya tinggal di block-ku."
"Jangan declare aku dua kali."
"Nilai boleh diganti."
const = paling ketat
"Aku tinggal di block-ku."
"Jangan declare aku dua kali."
"Dan binding-ku jangan di-reassign."
34. Cheat sheet super penting
var let const
------------------------------------------------------
Scope function block block
Reassign โ
โ
โ
Redeclare โ
โ โ
Sebelum
deklarasi undefined ReferenceError ReferenceError
Dan pola penggunaannya:
const name = "John";
Gunakan const jika tidak perlu mengganti binding.
let score = 0;
score = 10;
Gunakan let jika perlu mengganti nilai.
var name = "John";
Biasanya kamu akan menemukannya ketika membaca kode JavaScript lama/legacy.
๐ฏ Inti lecture ini
Kalau seluruh lecture ini diringkas menjadi satu konsep:
varadalah cara lama membuat variable di JavaScript.varmiripletkarena nilainya bisa diubah, tetapi berbeda karenavarmemiliki function scope, boleh di-redeclare, dan deklarasinya memiliki perilaku hoisting yang membuat akses sebelum deklarasi menghasilkanundefined.
Sedangkan JavaScript modern lebih mengutamakan:
const โ default
โ
kalau perlu reassign
โ
let
dan biasanya hindari var untuk kode baru.
Jadi untuk sekarang, cukup kuasai tiga kata kunci ini:
SCOPE
REDECLARATION
HOISTING
Karena itulah tiga pembeda utama var vs let/const yang ingin diajarkan oleh lecture ini.