Masukkan Password
34 3.5 Scope in Dart Programming Language | Variable Scope in Dart | Learn Dart Language | Dart Course
Materi berikutnya membahas Scope dalam Dart. Ini adalah konsep yang sangat penting karena akan menjelaskan di mana sebuah variable boleh digunakan dan di mana variable tersebut tidak boleh digunakan.
Catatan caption: “DOT/do programming language” yang dimaksud adalah Dart, dan “cly braces” maksudnya curly braces
{}.
1. Apa itu Scope?
Scope adalah wilayah atau area di dalam program tempat sebuah variable bisa diakses/digunakan.
Cara paling mudah membayangkannya:
Scope = wilayah kekuasaan sebuah variable.
Misalnya kita punya variable:
String name = "Budi";
Pertanyaannya:
Variable
nameini bisa dipakai di mana?
Jawabannya tergantung di mana variable tersebut dibuat.
Kalau dibuat di dalam sebuah function, biasanya variable tersebut hanya bisa digunakan di dalam function itu.
Kalau dibuat di luar semua function, variable tersebut bisa digunakan oleh banyak bagian program.
2. Analogi sederhana: rumah dan ruangan
Bayangkan program kita seperti sebuah rumah.
🏠 Rumah
│
├── 🛏️ Kamar 1
│
├── 🛋️ Ruang tamu
│
└── 🍳 Dapur
Kalau sebuah benda hanya berada di Kamar 1, orang di dapur belum tentu bisa langsung menggunakan benda tersebut.
Begitu juga variable.
void myFunction() {
String name = "Budi";
}
Variable name berada di dalam myFunction().
Jadi:
myFunction()
┌─────────────────────────┐
│ String name = "Budi"; │
│ │
│ name bisa digunakan │
│ di sini │
└─────────────────────────┘
main()
┌─────────────────────────┐
│ name ❌ │
└─────────────────────────┘
3. Tiga scope yang dibahas dalam materi
Materi ini membahas tiga jenis:
- Method / Function Scope
- Global Scope
- Lexical Scope
Kita bahas satu per satu.
4. Method / Function Scope
Pertama adalah method scope, yang juga disebut function scope dalam materi.
Misalnya:
void myFunction() {
String name = "Budi";
print(name);
}
Variable:
String name = "Budi";
dibuat di dalam myFunction().
Maka variable name bisa digunakan di dalam function tersebut.
Contohnya:
void myFunction() {
String name = "Budi";
print(name);
}
Output:
Budi
Karena name berada di dalam scope myFunction().
5. Tetapi tidak bisa digunakan di luar function
Sekarang misalnya:
void myFunction() {
String name = "Budi";
}
void main() {
print(name);
}
Ini akan menghasilkan error.
Kenapa?
Karena:
String name = "Budi";
hanya hidup di dalam:
myFunction()
Sedangkan kita mencoba menggunakannya di:
main()
Jadi secara sederhana:
myFunction()
┌─────────────────────────┐
│ String name = "Budi"; │
│ │
│ print(name); ✅ │
└─────────────────────────┘
↓
keluar
↓
main()
┌─────────────────────────┐
│ print(name); ❌ │
└─────────────────────────┘
6. Kenapa main() tidak bisa mengaksesnya?
Karena variable name tidak dibuat di dalam scope main().
Variable tersebut milik scope myFunction().
Jadi:
void myFunction() {
String name = "Budi";
}
bisa kita ibaratkan:
“
nameadalah variable pribadi milikmyFunction().”
Function lain tidak otomatis bisa mengaksesnya.
7. Function lain juga tidak bisa mengaksesnya
Misalnya kita punya dua function:
void myFunction() {
String name = "Budi";
}
void myFunction2() {
print(name);
}
Ini juga error.
Kenapa?
Karena name hanya berada di scope:
myFunction
Bukan:
myFunction2
Jadi:
myFunction()
┌─────────────────┐
│ name │
└─────────────────┘
❌
↓
myFunction2()
┌─────────────────┐
│ tidak punya │
│ akses ke name │
└─────────────────┘
8. Kesimpulan Function Scope
Kalau variable dibuat di dalam function:
void myFunction() {
String name = "Budi";
}
maka variable tersebut hanya bisa digunakan di dalam function tersebut.
Ingat:
Variable di dalam function → scope-nya terbatas pada function tersebut.
9. Global Scope
Sekarang kita masuk ke Global Scope.
Global scope adalah kebalikannya.
Misalnya:
String name = "Budi";
void myFunction() {
print(name);
}
void myFunction2() {
print(name);
}
void main() {
print(name);
}
Variable:
String name = "Budi";
dibuat di luar semua function.
Karena itu, variable tersebut memiliki scope yang lebih luas.
Secara sederhana:
GLOBAL
String name = "Budi";
│
├────→ myFunction()
│
├────→ myFunction2()
│
└────→ main()
Ketiga function tersebut bisa mengakses name.
10. Kenapa disebut Global?
Karena variable tersebut berada pada scope yang luas, bukan hanya milik satu function.
Contoh:
String name = "Budi";
int age = 23;
Kemudian:
void myFunction() {
print(name);
print(age);
}
void main() {
print(name);
print(age);
}
Keduanya bisa menggunakan variable tersebut.
Output misalnya:
Budi
23
Budi
23
11. Posisi variable sangat menentukan scope
Bandingkan dua kode berikut.
Variable di dalam function
void main() {
String name = "Budi";
}
name hanya bisa digunakan di dalam scope main().
Sedangkan:
Variable di luar function
String name = "Budi";
void main() {
print(name);
}
name berada pada scope global.
12. Perhatikan posisi {}
Dari materi, disebutkan bahwa Dart menggunakan curly braces {} untuk menentukan scope.
Contoh:
void myFunction() {
String name = "Budi";
print(name);
}
Kurung kurawal:
{
...
}
menentukan sebuah block.
Variable yang dibuat di dalam block tersebut memiliki scope yang berkaitan dengan block tersebut.
13. Lexical Scope
Sekarang bagian yang agak membingungkan:
Lexical scope.
Sebenarnya konsepnya masih sama:
Variable yang dibuat di dalam sebuah block tidak bisa diakses dari luar block tersebut.
Contoh yang diberikan materi adalah for.
for (int i = 1; i <= 10; i++) {
print(i);
}
Variable:
int i = 1;
dibuat di dalam block for.
Maka kita bisa menggunakan i di dalam block tersebut:
for (int i = 1; i <= 10; i++) {
print(i);
}
Tetapi setelah keluar dari block:
for (int i = 1; i <= 10; i++) {
print(i);
}
print(i); // ❌
i tidak bisa digunakan lagi.
14. Kenapa i tidak bisa digunakan?
Karena i dibuat di sini:
for (int i = 1; i <= 10; i++) {
Variable i berada di dalam scope loop tersebut.
Gambaran sederhananya:
FOR BLOCK
┌──────────────────────────┐
│ int i = 1; │
│ │
│ print(i); ✅ │
└──────────────────────────┘
↓
keluar
↓
print(i); ❌
Jadi i tidak tersedia di luar block for.
15. Contoh dengan if
Bukan hanya for.
Block if juga mempunyai scope.
Misalnya:
if (true) {
String name = "Budi";
print(name);
}
Ini valid.
Karena name digunakan di dalam block tempat dia dibuat.
Tetapi:
if (true) {
String name = "Budi";
}
print(name);
❌ Error.
Karena kita mencoba menggunakan name setelah keluar dari block if.
16. Gambaran scope if
if (true) {
┌──────────────────────┐
│ String name = "Budi" │
│ │
│ print(name); ✅ │
└──────────────────────┘
}
print(name); ❌
Variable name hanya tersedia di dalam block tersebut.
17. Jadi apa bedanya Function Scope dan Lexical Scope?
Ini bagian yang sangat penting.
Keduanya memang mirip, bahkan bisa terasa tumpang tindih untuk pemula.
Perbedaannya terutama pada wilayah/block yang dibicarakan.
Function Scope
Variable dibuat di dalam function:
void myFunction() {
String name = "Budi";
}
Scope-nya berkaitan dengan function tersebut.
Lexical / Block Scope
Variable dibuat di dalam sebuah block:
if (true) {
String name = "Budi";
}
atau:
for (int i = 0; i < 10; i++) {
print(i);
}
Scope-nya berkaitan dengan block tersebut.
18. Struktur nested scope
Sekarang kita buat contoh yang lebih menarik.
void main() {
String name = "Budi";
if (true) {
print(name);
}
}
Apakah ini boleh?
Ya.
Kenapa?
Karena name berada di scope luar, sedangkan if berada di dalamnya.
Gambarnya:
main()
┌─────────────────────────────┐
│ String name = "Budi"; │
│ │
│ if (true) { │
│ ┌───────────────────────┐ │
│ │ print(name); ✅ │ │
│ └───────────────────────┘ │
│ │
└─────────────────────────────┘
Scope yang lebih dalam bisa mengakses variable dari scope luar, selama variable tersebut memang terlihat dari sana.
19. Tetapi arah sebaliknya tidak berlaku
Misalnya:
void main() {
if (true) {
String name = "Budi";
}
print(name);
}
❌ Tidak boleh.
Karena:
main()
┌─────────────────────────────┐
│ │
│ if │
│ ┌─────────────────────────┐ │
│ │ name │ │
│ └─────────────────────────┘ │
│ │
│ print(name); ❌ │
└─────────────────────────────┘
name dibuat di scope yang lebih dalam.
Scope luar tidak bisa melihat variable tersebut.
20. Prinsip penting: luar → dalam bisa
Perhatikan:
String name = "Budi";
void main() {
if (true) {
print(name);
}
}
Ini bisa.
Karena name berada di luar dan if berada di dalam.
Secara sederhana:
OUTER SCOPE
↓
INNER SCOPE
✅ inner bisa melihat outer
21. Tetapi dalam → luar tidak bisa
Contoh:
void main() {
if (true) {
String name = "Budi";
}
print(name);
}
Tidak bisa.
OUTER SCOPE
↑
INNER SCOPE
❌ outer tidak bisa melihat variable
yang hanya dibuat di inner
Ini salah satu aturan scope yang paling penting.
22. Contoh nested scope
Misalnya:
void main() {
String name = "Budi";
if (true) {
int age = 23;
print(name);
print(age);
}
print(name);
}
Apa yang terjadi?
Di dalam if
print(name);
✅ Bisa.
Karena name berasal dari outer scope.
print(age);
✅ Bisa.
Karena age dibuat di dalam scope if.
Setelah if
print(name);
✅ Bisa.
Karena name dibuat di outer scope.
Tetapi:
print(age);
❌ Tidak bisa.
Karena age hanya ada di dalam if.
23. Visualisasinya
main()
│
│ String name = "Budi"; ← outer scope
│
├── if (true)
│ │
│ │ int age = 23; ← inner scope
│ │
│ │ print(name); ✅
│ │ print(age); ✅
│
│ print(name); ✅
│ print(age); ❌
Ini adalah pola yang sangat penting untuk dipahami.
24. Contoh dengan for
Misalnya:
void main() {
for (int i = 1; i <= 3; i++) {
print(i);
}
print(i);
}
Baris terakhir:
print(i);
❌ Error.
Karena i hanya dibuat untuk kebutuhan loop.
Ini justru sangat berguna.
Misalnya kita tidak ingin variable penghitung loop bisa digunakan sembarangan di luar loop.
25. Kenapa Scope penting?
Scope bukan sekadar aturan yang membuat kita mendapat error.
Scope memiliki beberapa manfaat.
1. Menghindari konflik nama
Misalnya kita mempunyai:
void functionA() {
String name = "Budi";
}
void functionB() {
String name = "Andi";
}
Ini bisa dilakukan.
Kedua variable sama-sama bernama:
name
tetapi berada di scope berbeda.
functionA
└── name = "Budi"
functionB
└── name = "Andi"
Mereka tidak saling bertabrakan karena scope-nya berbeda.
26. 2. Membatasi akses variable
Tidak semua variable harus bisa digunakan di seluruh program.
Contohnya:
void calculate() {
int temporaryResult = 100;
}
temporaryResult hanya diperlukan untuk proses calculate().
Tidak perlu membuatnya global.
Dengan scope, kita bisa membatasi penggunaannya.
27. 3. Program menjadi lebih terorganisir
Misalnya:
void calculate() {
int result = 10 + 20;
print(result);
}
result hanya dibutuhkan untuk function tersebut.
Maka lebih baik:
void calculate() {
int result = 10 + 20;
}
daripada membuat:
int result = 30;
secara global jika memang tidak diperlukan di tempat lain.
28. Global variable harus digunakan dengan bijak
Materi mengatakan global variable dapat diakses di berbagai function. Itu benar secara konsep.
Misalnya:
String name = "Budi";
void functionA() {
print(name);
}
void functionB() {
print(name);
}
Tetapi bukan berarti:
“Semua variable sebaiknya dibuat global.”
Justru biasanya kita ingin scope variable sesempit mungkin sesuai kebutuhan.
Kalau variable hanya digunakan di satu function, lebih baik letakkan di function tersebut.
29. Perhatikan contoh ini
Kurang baik jika tidak diperlukan:
String name = "Budi";
void main() {
print(name);
}
Kalau name memang hanya digunakan di main(), kita bisa menulis:
void main() {
String name = "Budi";
print(name);
}
Sekarang scope name lebih terbatas.
30. Ringkasan tiga scope dari materi
| Scope | Variable dibuat di | Bisa diakses di |
|---|---|---|
| Function/Method Scope | Dalam function | Function tersebut |
| Global Scope | Di luar function | Banyak bagian/function yang berada dalam jangkauan |
| Lexical/Block Scope | Dalam block {} seperti if, for | Block tersebut |
Contoh:
Function Scope
void myFunction() {
String name = "Budi";
}
name → hanya di myFunction().
Global Scope
String name = "Budi";
void myFunction() {
print(name);
}
name → dapat diakses dari function yang berada dalam jangkauan global tersebut.
Block/Lexical Scope
if (true) {
String name = "Budi";
}
name → hanya di dalam block if.
31. Cara paling mudah mengingatnya
Bayangkan ada kotak-kotak.
GLOBAL
┌───────────────────────────────────┐
│ name = "Budi" │
│ │
│ FUNCTION │
│ ┌───────────────────────────┐ │
│ │ age = 23 │ │
│ │ │ │
│ │ IF │ │
│ │ ┌───────────────────┐ │ │
│ │ │ city = "Madiun" │ │ │
│ │ └───────────────────┘ │ │
│ │ │ │
│ └───────────────────────────┘ │
└───────────────────────────────────┘
Aturannya:
name→ bisa dilihat dari scope yang lebih dalam.age→ bisa digunakan di function tersebut dan block di dalamnya.city→ hanya bisa digunakan di blockif.- Scope luar tidak bisa mengambil variable yang hanya ada di scope dalam.
32. Satu aturan emas
Kalau kamu masih bingung dengan scope, ingat kalimat ini:
Variable yang dibuat di luar bisa digunakan oleh bagian di dalam jangkauannya, tetapi variable yang hanya dibuat di dalam tidak bisa digunakan dari luar.
Contoh:
String a = "A";
void main() {
String b = "B";
if (true) {
String c = "C";
print(a); // ✅
print(b); // ✅
print(c); // ✅
}
print(a); // ✅
print(b); // ✅
print(c); // ❌
}
Kenapa?
a → global → paling luar
b → main() → di tengah
c → if → paling dalam
Semakin ke dalam, kita bisa melihat scope di luar.
Tetapi scope di luar tidak bisa melihat variable yang hanya dibuat di dalam.
33. Kesimpulan materi
Scope menentukan di mana variable dapat digunakan.
Ada tiga konsep yang perlu kamu ingat dari video:
1. Function Scope
↓
variable di dalam function
→ hanya untuk function tersebut
2. Global Scope
↓
variable di luar function
→ dapat digunakan dari berbagai bagian program
3. Lexical / Block Scope
↓
variable di dalam block {}
→ hanya tersedia dalam block tersebut
Dan aturan terpenting:
OUTER SCOPE
↓
INNER SCOPE
Inner bisa mengakses outer
✅
Outer tidak bisa mengakses
variable yang hanya ada di inner
❌
Hafalan singkat:
Scope = “variable ini kelihatan dari mana?”
Jadi setiap kali kamu membuat variable, biasakan bertanya:
“Variable ini saya buat di dalam scope apa, dan nanti mau saya pakai di mana?”
Kalau kamu memahami pertanyaan itu, konsep scope di Dart akan jauh lebih mudah.