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
  • persistent untuk counter antar pemanggilan, dan global yang 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:

matlab
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:

text
hitungPanggilan() ke-1 : 1
hitungPanggilan() ke-2 : 2
hitungPanggilan() ke-3 : 3
exist jumlahPanggilan  : 0

Tiga pemanggilan menghasilkan 1, 2, 3 — padahal jumlahPanggilan tidak bisa ditemukan dari luar (exist 0). Rahasianya ada di persistent:

matlab
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;
end

Mari kita bedah baris-baris kode di atas:

  1. Baris 7 (persistent jumlahPanggilan): mendeklarasikan variabel persistent — nilainya bertahan antar pemanggilan meskipun function workspace dibuang.
  2. Baris 10-12 (if isempty(jumlahPanggilan)): saat pertama kali ditemui, MATLAB menginisialisasi variabel persistent dengan []; pemeriksaan isempty mengubahnya menjadi 0 sekali saja.
  3. 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:

matlab
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
end

Di Command Window, pemanggilan langsung berakhir galat:

text
>> 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:

matlab
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');
end

Output yang Dihasilkan:

text
cobaBacaBase gagal: nilaiRahasia tidak terlihat di fungsi

global: 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:

matlab
global hitungGlobal
hitungGlobal = 10;
naikkanGlobal();
naikkanGlobal();
fprintf('hitungGlobal          : %d (dinaikkan dua kali dari fungsi)\n', ...
    hitungGlobal);

Output yang Dihasilkan:

text
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:

matlab
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;
end

Nested 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:

matlab
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
end

Output yang Dihasilkan:

text
total dari demoNested : 8

Nested 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 #

WilayahDibuat olehHidup selamaTerlihat oleh
Base workspaceskrip / Command Windowsampai clear/keluar sesiskrip lain & Command Window
Function workspacetiap pemanggilan fungsiselama fungsi berjalanhanya fungsi itu
Variabel persistentdeklarasi persistentantar pemanggilan (reset saat clear fungsi)hanya fungsi itu
Variabel globaldeklarasi globalsampai clear globalsemua yang mendeklarasikannya
Workspace induk + nestedfungsi berisi nestedselama induk berjalaninduk & 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.