Selama satu section penuh kita menulis fungsi tanpa bertanya: di sebenarnya variabel bersih, luas, dan k itu hidup? Jawabannya menentukan banyak perilaku yang mengejutkan pemula — variabel yang “hilang” setelah fungsi selesai, fungsi yang tidak bisa membaca variabel skrip, counter yang ajaib mengingat nilainya antar pemanggilan. Semuanya diatur oleh scope (di mana sebuah nama dikenal) dan workspace (wadah tempat variabel disimpan). Chapter ini memetakan seluruh wilayah tersebut. Cakupannya:
- base workspace vs function workspace
- variabel fungsi yang hanya hidup selama pemanggilan
persistentuntuk counter antar pemanggilan, danglobalyang sebaiknya dihindari- nested function yang berbagi workspace dengan induknya
Base Workspace dan Function Workspace #
Aturannya: skrip dan Command Window menaruh variabel di base workspace; setiap pemanggilan fungsi mendapat function workspace sendiri yang dibuat saat fungsi dipanggil dan dibuang saat fungsi selesai. Mekanisme di balik layar: saat kita memanggil olahData(data), MATLAB menyalin nilai data ke parameter di function workspace baru — variabel bersih dan urut yang diciptakan fungsi tidak pernah menyentuh base workspace. Satu-satunya jalan data keluar adalah lewat output:
Diagram di atas menegaskan dua hal: nilai mengalir lewat input dan output, dan tidak ada pintu rahasia dari base workspace ke variabel lokal fungsi.
Variabel Fungsi Hanya Hidup Saat Fungsi Berjalan #
Bukti paling sederhana: variabel lokal tidak bisa ditemukan setelah fungsi selesai. Skrip contoh.m memanggil hitungPanggilan() tiga kali, lalu memeriksa apakah variabel internalnya terlihat:
fprintf('hitungPanggilan() ke-1 : %d\n', hitungPanggilan());
fprintf('hitungPanggilan() ke-2 : %d\n', hitungPanggilan());
fprintf('hitungPanggilan() ke-3 : %d\n', hitungPanggilan());
% ...tetap variabelnya tetap milik function workspace: tidak terlihat
fprintf('exist jumlahPanggilan : %d\n', exist('jumlahPanggilan'));Output yang Dihasilkan:
hitungPanggilan() ke-1 : 1
hitungPanggilan() ke-2 : 2
hitungPanggilan() ke-3 : 3
exist jumlahPanggilan : 0Tiga pemanggilan menghasilkan 1, 2, 3 — padahal jumlahPanggilan tidak bisa ditemukan dari luar (exist 0). Rahasianya ada di persistent:
function n = hitungPanggilan()
% hitungPanggilan Menghitung berapa kali fungsi ini dipanggil.
% n = hitungPanggilan() menaikkan counter lalu mengembalikan nilainya.
% Variabel persistent menyimpan nilai antar pemanggilan, tetap hanya
% terlihat di dalam fungsi ini.
persistent jumlahPanggilan
% variabel persistent diinisialisasi dengan [] — cek dulu
if isempty(jumlahPanggilan)
jumlahPanggilan = 0;
end
jumlahPanggilan = jumlahPanggilan + 1;
n = jumlahPanggilan;
endMari kita bedah baris-baris kode di atas:
- Baris 7 (
persistent jumlahPanggilan): mendeklarasikan variabel persistent — nilainya bertahan antar pemanggilan meskipun function workspace dibuang. - Baris 10-12 (
if isempty(jumlahPanggilan)): saat pertama kali ditemui, MATLAB menginisialisasi variabel persistent dengan[]; pemeriksaanisemptymengubahnya menjadi 0 sekali saja. - Baris 14-15 (
jumlahPanggilan + 1; n = ...): counter naik lalu nilainya dikembalikan — tetap lewat output, tetap privat.
Fungsi Tidak Melihat Base Workspace #
Arah sebaliknya juga tertutup: fungsi tidak bisa membaca variabel base workspace yang tidak dikirim sebagai input. Berkas cobaBacaBase.m sengaja menyebut nama nilaiRahasia yang hanya ada di skrip pemanggil:
function cobaBacaBase()
% cobaBacaBase Membuktikan base workspace tidak terlihat dari fungsi.
% Fungsi ini sengaja menyebut nama nilaiRahasia tanpa menerimanya
% sebagai input. Pemanggilan tanpa try/catch menghasilkan galat
% "variabel tidak dikenal".
disp(nilaiRahasia); % nama ini tidak ada di function workspace
endDi Command Window, pemanggilan langsung berakhir galat:
>> nilaiRahasia = 42;
>> cobaBacaBase()
Unrecognized function or variable 'nilaiRahasia'.Skrip contoh.m menangkap galat itu dengan try/catch (pola dari Chapter Error Handling Dasar) dan mencetak penjelasannya — di Octave rumusan pesannya berbeda, tetapi kegagalannya sama:
nilaiRahasia = 42; % variabel di base workspace (milik skrip ini)
% fungsi menyebut nama nilaiRahasia tanpa menerimanya sebagai input
try
cobaBacaBase();
catch
fprintf('cobaBacaBase gagal: nilaiRahasia tidak terlihat di fungsi\n');
endOutput yang Dihasilkan:
cobaBacaBase gagal: nilaiRahasia tidak terlihat di fungsiglobal: Pintu yang Selayaknya Dihindari #
Kata kunci global memang menembus sekat workspace: variabel yang dideklarasikan global di dua tempat berbagi satu salinan. Demo di contoh.m membuktikan dayanya — naikkanGlobal() mengubah angka milik skrip:
global hitungGlobal
hitungGlobal = 10;
naikkanGlobal();
naikkanGlobal();
fprintf('hitungGlobal : %d (dinaikkan dua kali dari fungsi)\n', ...
hitungGlobal);Output yang Dihasilkan:
hitungGlobal : 12 (dinaikkan dua kali dari fungsi)Kuncinya ada di isi naikkanGlobal.m: fungsi itu mendeklarasikan global hitungGlobal juga, sehingga keduanya menunjuk salinan yang sama:
function naikkanGlobal()
% naikkanGlobal Menaikkan variabel global hitungGlobal (demo pola global).
% Deklarasi global di kedua sisi (skrip dan fungsi) membuat keduanya
% membagi satu variabel yang sama. Pola ini rawan galat — utamakan
% aliran data lewat input/output.
global hitungGlobal
hitungGlobal = hitungGlobal + 1;
endNested Function: Berbagi Workspace dengan Induk #
Pengecualian scope yang berguna: nested function — fungsi yang didefinisikan di dalam badan fungsi lain — berbagi workspace dengan fungsi induknya, bukan menerima salinan. Berkas demoNested.m menunjukkan tambah mengubah total milik induk tanpa input/output:
function demoNested()
% demoNested Nested function berbagi workspace dengan induknya.
% Fungsi tambah didefinisikan DI DALAM demoNested dan langsung
% mengubah variabel total milik induk — tanpa input/output.
total = 0;
tambah(5);
tambah(3);
fprintf('total dari demoNested : %d\n', total);
function tambah(n)
% nested function: melihat dan mengubah variabel induk
total = total + n;
end
endOutput yang Dihasilkan:
total dari demoNested : 8Nested function menuntut end pada semua fungsi dalam berkas (aturan dari Chapter Membuat Function) dan paling berguna untuk callback dan fungsi pembantu yang memang butuh membagi status dengan induknya — sisanya, local function tetap pilihan yang lebih terkontrol.
Peta Lengkap Workspace #
| Wilayah | Dibuat oleh | Hidup selama | Terlihat oleh |
|---|---|---|---|
| Base workspace | skrip / Command Window | sampai clear/keluar sesi | skrip lain & Command Window |
| Function workspace | tiap pemanggilan fungsi | selama fungsi berjalan | hanya fungsi itu |
Variabel persistent | deklarasi persistent | antar pemanggilan (reset saat clear fungsi) | hanya fungsi itu |
Variabel global | deklarasi global | sampai clear global | semua yang mendeklarasikannya |
| Workspace induk + nested | fungsi berisi nested | selama induk berjalan | induk & nested-nya |
Ringkasan #
Scope MATLAB dibentuk oleh workspace yang terpisah: skrip hidup di base workspace, sedangkan tiap pemanggilan fungsi membawa function workspace yang lahir dan dibuang bersama pemanggilan itu — variabel lokalnya tidak terlihat dari luar dan sebaliknya, variabel base workspace tidak terbaca fungsi. persistent menjembatani waktu (nilai bertahan antar pemanggilan) tanpa membuka akses, global menjembatani tempat dengan risiko kopling tersembunyi, dan nested function berbagi workspace induknya untuk status yang memang perlu dibagi. Aliran data yang sehat tetap satu: input masuk, output keluar. Berkas contoh.m beserta hitungPanggilan.m, cobaBacaBase.m, naikkanGlobal.m, dan demoNested.m di bagian bawah halaman memuat seluruh demo yang sudah teruji.