
Variabel global adalah memecah belah: jalan pintas yang tak ternilai atau contoh berbahaya dari kode ceroboh? Mari kita bicara tentang apa yang mereka lakukan, untuk apa mereka baik, dan mengapa Anda harus ekstra hati -hati menggunakannya.
Apa itu variabel global?
Program komputer, pada dasarnya, merupakan daftar instruksi untuk dilaksanakan komputer saat Anda menjalankannya. Namun, sebagian besar program cukup kompleks sehingga mereka melebihi daftar satu per satu sederhana. Struktur seperti blok, fungsi, dan definisi kelas dapat membantu Anda mengatur kode Anda agar lebih mudah dikelola.
Fungsi adalah alat paling dasar yang dapat Anda gunakan untuk mengelompokkan kode, mengisolasi perilakunya dari sisa program Anda. Anda dapat memanggil fungsi dari bagian lain dari kode Anda dan menggunakan kembali logika yang sama tanpa harus menduplikasinya berulang kali.
Berikut adalah contoh fungsi JavaScript yang menggunakan dua jenis variabel, argumen fungsi dan variabel lokal:
function factorial(x) {
let i; for (i = x - 1; i > 0; i--)
x *= i;
return x;
}
factorial(4);
Argumen fungsi, x, secara otomatis dihuni dengan nilai yang diteruskan ke fungsi ketika dipanggil. Dalam contoh di atas, dibutuhkan nilai 4.
Variabel I dinyatakan menggunakan kata kunci LET. Ini memastikan itu adalah variabel lokal. Awalnya, nilainya tidak terdefinisi, sebelum loop For Loop menetapkan dan memodifikasi nilainya.
Setiap variabel tersingkir dengan fungsi faktorial; Tidak ada kode lain yang dapat membaca atau menulis nilai -nilai X atau i. Anda dapat menjalankan JavaScript ini di konsol browser Anda dan mengonfirmasi bahwa variabel X dan I tidak terlihat di luar fungsi:
JavaScript juga mendukung variabel global, yang memiliki ruang lingkup di seluruh program. Berikut adalah versi alternatif dari fungsi faktorial yang mengharuskan Anda mengatur variabel global sebelum Anda menyebutnya, daripada meloloskan argumen:
function factorial() {
let i; for (i = x - 1; i > 0; i--)
x *= i;
return x;
}
var x = 4;
factorial();
Ini adalah jenis fungsi yang sangat tidak ortodoks, yang tidak praktis dan hanya digunakan di sini untuk menunjukkan potensi penggunaan variabel global. Ini berhasil, tetapi canggung dan lebih canggung untuk digunakan. Bahkan, pendekatan ini menyerupai kode perakitan lama, yang tidak memiliki konsep fungsi sama sekali.
Sebagian besar bahasa pemrograman mendukung variabel global, tetapi mereka cenderung melakukannya dengan cara yang berbeda. Misalnya, PHP menggunakan kata kunci global untuk mengakses variabel yang dinyatakan di luar fungsi apa pun:
$a = 0;
$b = 0;function inc() {
global $a;
$a = 2;
$b = 2;
}
inc();
echo "a is $a and b is $b\n";
Dalam kode ini, fungsi INC menggunakan kata kunci global untuk mengakses $ variabel yang dinyatakan di tingkat atas. Ketika menetapkan $ A, itu mengubah variabel tingkat atas itu, sehingga output mengkonfirmasi memiliki nilai 2. Namun, $ B tidak dinyatakan Global Inside Inc, sehingga fungsi hanya mengubah variabel lokal-yang kebetulan berbagi nama yang sama. Variabel tingkat atas asli menjaga nilainya dari 0.
Bagaimana variabel global dapat disalahgunakan?
Masalah utama dengan variabel global adalah bahwa mereka memecahkan enkapsulasi, memperkenalkan potensi luas untuk bug. Pertimbangkan contoh ini:
var days = [ "Sunday", "Monday", "Tuesday", "Wednesday",
"Thursday", "Friday", "Saturday" ];function day_name(number) {
return days[number];
}
Fungsi day_name () mengakses array global untuk mengembalikan nama sehari, yang diberikan oleh nomornya. Dalam program kecil, ini mungkin bukan masalah, tetapi seiring dengan panjang program dan kompleksitas, bug dapat berkembang.
Sebagai permulaan, karena variabel hari adalah global, bagian lain dari basis kode dapat mengubahnya. Kode berikut dapat terjadi di mana saja dan secara fundamental mengubah perilaku day_name:
days[5] = "I don't know when";
Dalam program yang lebih besar, mungkin sulit dan memakan waktu untuk mengidentifikasi bagian-bagian kode yang menggunakan atau mengubah variabel global.
Masalah ini bahkan lebih besar jika kode Anda multi-threaded. Dengan beberapa salinan kode Anda berjalan, jauh lebih sulit untuk memastikan mereka semua mengakses dan memodifikasi variabel global tanpa menginjak kaki satu sama lain.
Kode ini juga digabungkan dengan ketat, yang membuatnya lebih sulit untuk diuji. Memperkenalkan ketergantungan antara fungsi dan variabel global berarti bahwa keduanya harus selalu hidup berdampingan, dan menguji suatu fungsi secara terpisah menjadi sedikit lebih sulit.

Terkait
Apa itu pengujian unit dan mengapa itu penting?
Pengujian unit adalah proses penulisan dan secara otomatis menjalankan tes untuk memastikan bahwa fungsi yang Anda kode berfungsi seperti yang diharapkan.
Semakin banyak variabel global yang Anda miliki, semakin besar kemungkinan bentrokan nama itu akan terjadi. Untuk JavaScript, ini adalah masalah khusus karena objek global. Di browser web, semua variabel global disimpan sebagai properti dari objek jendela. Ini berarti mudah untuk mendeklarasikan variabel global yang mengesampingkan properti jendela bahwa kode Anda – atau orang lain – asume ada.
var alert = "no you don't";...
window.alert("Press OK to continue");
Panggilan ke window.alert () akan gagal dengan kesalahan karena sekarang menjadi string, bukan fungsi. Meskipun Anda tidak akan menulis kode ini dengan sengaja, sangat mudah untuk melakukannya secara tidak sengaja. Semakin banyak variabel global yang Anda gunakan, semakin besar kemungkinan Anda menginjak kaki beberapa kode lainnya. Anda dapat mencoba menghindari ini dengan menggunakan nama yang lebih tidak biasa untuk variabel global Anda, tetapi ini hanya plester yang lengket; Tidak ada jaminan kode Anda akan aman.
Semua masalah ini bisa lebih luas jika Anda menggunakan pustaka eksternal, tergantung pada bagaimana bahasa Anda melindungi Anda. JavaScript menawarkan beberapa perlindungan di sini, jadi, jika Anda tidak hati -hati, variabel global dapat memecahkan kode perpustakaan yang Anda gunakan – atau sebaliknya.
Dan untuk apa variabel global?
Variabel global tidak semuanya buruk – pada kenyataannya, kadang -kadang diperlukan, dan menghindarinya di semua biaya mungkin mahal! Inilah contoh yang sangat masuk akal:
var debug = true;function do_something() {
let res = do_a_thing();
if (debug) {
console.debug("res was", res);
}
return res;
}
Pendekatan untuk debugging ini dapat berguna selama pengembangan dan pengujian, dan baik -baik saja untuk program yang lebih kecil. Ini masih rentan terhadap masalah, terutama fakta bahwa bagian kode mana pun dapat mengubah nilai debug; itu bisa berubah. Untuk menghindarinya, praktik terbaik untuk menyatakan variabel sebagai konstan jika Anda ingin mencegah nilainya diubah:
const SECONDS_IN_MINUTE = 60;
Penting untuk dicatat bahwa konstanta dalam JavaScript tidak, secara ketat, adalah global. Untuk satu hal, itu tidak akan ditambahkan sebagai properti dari objek jendela. Tetapi konstan yang Anda nyatakan di tingkat atas skrip akan terlihat oleh semua kode yang mengikutinya.

Terkait
Let, var, dan const: mendefinisikan variabel dalam javascript
Finalisasi ES6 pada tahun 2015 membawa cara -cara baru untuk mendefinisikan variabel JavaScript.
Jika Anda menemukan diri Anda menggunakan variabel global, Anda juga dapat mengurangi kemungkinan masalah dengan menggunakan satu objek global tunggal. Misalnya, alih -alih:
var color = [0, 0, 255];
var debug = false;
var days = 7;
...
Anda dapat menyimpan nilai yang sama di peta global:
var all_my_globals = {
color: [0, 0, 255],
debug: false,
days: 7,
...
};
Dengan pendekatan ini, Anda baru saja menambahkan satu nama ke namespace global, jadi ada lebih sedikit peluang itu akan bertentangan dengan orang lain, dan lebih mudah untuk mencari kode Anda untuk menemukan penggunaan variabel ini.
Akhirnya, dokumentasi adalah teman Anda. Jika Anda harus menggunakan variabel global, pastikan mereka dijelaskan dalam komentar, terutama jika Anda mempertimbangkan pendekatan alternatif tetapi akhirnya menolaknya. Nama variabel juga bertindak sebagai dokumentasi, jadi pastikan Anda menggunakan nama spesifik yang jelas, ringkas, yang menjelaskan tujuan masing -masing variabel.