Rumah > Artikel > hujung hadapan web > ⚠️ Bahaya Tersembunyi Menggunakan `var` dalam JavaScript: Mengapa Tiba Masanya untuk Bergerak
Kata kunci var telah menjadi cara lalai untuk mengisytiharkan pembolehubah dalam JavaScript selama bertahun-tahun. Walau bagaimanapun, ia mempunyai beberapa keanehan dan perangkap yang boleh membawa kepada tingkah laku yang tidak dijangka dalam kod anda. Alternatif moden seperti let dan const menyelesaikan banyak masalah ini, menjadikannya pilihan pilihan untuk mengisytiharkan pembolehubah dalam kebanyakan kes.
? Penjelasan:
Dalam JavaScript, pengisytiharan var dinaikkan ke bahagian atas skopnya, bermakna ia dimulakan sebagai tidak ditentukan walaupun pengisytiharan muncul kemudian dalam kod. Ini boleh menyebabkan tingkah laku mengelirukan dan membawa kepada pepijat yang sukar dikesan.
? Perkara Utama:
? Contoh:
console.log(myVar); // undefined (hoisted but not initialized) var myVar = 10; console.log(myVar); // 10
? Komen: Pembolehubah myVar dinaikkan ke bahagian atas skop tetapi pada mulanya tidak ditentukan, yang boleh menyebabkan kekeliruan dalam kod anda.
? Betulkan:
? Contoh Pembetulan:
console.log(myLet); // ReferenceError: myLet is not defined let myLet = 10; console.log(myLet); // 10
? Komen: Menggunakan let menghalang pembolehubah daripada diakses sebelum ia diisytiharkan, mengurangkan kekeliruan dan potensi pepijat.
? Penjelasan:
Salah satu kelemahan utama var ialah ia berskop fungsi, bukan berskop blok. Ini bermakna pembolehubah yang diisytiharkan dalam gelung, jika penyataan atau blok lain tidak terhad kepada blok itu, tetapi boleh diakses di luarnya, yang boleh membawa kepada pepijat.
? Perkara Utama:
? Contoh:
if (true) { var blockVar = "I’m accessible outside this block"; } console.log(blockVar); // "I’m accessible outside this block"
? Komen: Walaupun blockVar telah diisytiharkan di dalam blok if, ia masih boleh diakses di luar blok kerana var adalah skop fungsi, bukan skop blok.
? Betulkan:
? Contoh Pembetulan:
if (true) { let blockLet = "I’m only accessible inside this block"; } console.log(blockLet); // ReferenceError: blockLet is not defined
? Komen: Menggunakan let atau const memastikan pembolehubah kekal terhad pada blok masing-masing, mengelakkan kebocoran skop.
? Penjelasan:
Dengan var, anda secara tidak sengaja boleh mengisytiharkan semula pembolehubah yang sama dalam skop yang sama, yang boleh menimpa nilai sebelumnya. Ini boleh membawa kepada pepijat yang tidak disengajakan, terutamanya dalam pangkalan kod yang lebih besar di mana nama pembolehubah mungkin digunakan semula secara tidak sengaja.
? Perkara Utama:
? Contoh:
var name = "Alice"; var name = "Bob"; // No error, overwrites the previous value console.log(name); // "Bob"
? Komen: Pengisytiharan nama kedua menimpa yang pertama, yang berpotensi menyebabkan pepijat dalam kod.
? Betulkan:
? Contoh Pembetulan:
let name = "Alice"; let name = "Bob"; // SyntaxError: Identifier 'name' has already been declared
? Komen: Menggunakan let atau const membantu anda mengelakkan pengisytiharan semula pembolehubah dan memastikan kod anda kekal boleh diramal.
? Penjelasan:
Apabila menggunakan var dalam gelung, nilai pembolehubah boleh berubah dalam cara yang tidak dijangka, terutamanya apabila bekerja dengan kod tak segerak. Memandangkan var adalah skop fungsi dan bukan skop blok, pemboleh ubah gelung mungkin memegang nilai yang tidak dijangka apabila diakses dalam panggilan balik tak segerak.
? Perkara Utama:
? Example:
for (var i = 0; i < 3; i++) { setTimeout(() => console.log(i), 1000); // Prints: 3, 3, 3 (unexpected) }
? Comment: Because var is not block-scoped, the loop variable i is shared across all iterations, and its final value (3) is used in each setTimeout callback.
? Fix:
? Example Fix:
for (let i = 0; i < 3; i++) { setTimeout(() => console.log(i), 1000); // Prints: 0, 1, 2 (as expected) }
? Comment: Using let creates a new instance of i for each iteration, fixing the asynchronous callback issue and ensuring the correct values are printed.
? Explanation:
Closures can lead to unexpected behavior when combined with var. Since var is function-scoped, its value might change in ways that are not expected when a closure captures it.
? Key Points:
? Example:
function createFunctions() { var funcs = []; for (var i = 0; i < 3; i++) { funcs.push(function() { console.log(i); }); } return funcs; } var myFuncs = createFunctions(); myFuncs[0](); // 3 (unexpected) myFuncs[1](); // 3 (unexpected) myFuncs[2](); // 3 (unexpected)
? Comment: All closures are capturing the same i value because var is function-scoped, leading to unexpected results.
? Fix:
? Example Fix:
function createFunctions() { var funcs = []; for (let i = 0; i < 3; i++) { funcs.push(function() { console.log(i); }); } return funcs; } var myFuncs = createFunctions(); myFuncs[0](); // 0 myFuncs[1](); // 1 myFuncs[2](); // 2
? Comment: With let, each closure gets its own copy of i, fixing the issue and ensuring the expected values are printed.
While var was the original way to declare variables in JavaScript, it has several shortcomings that make it a poor choice in modern JavaScript development. The introduction of let and const provides better scoping, reduces the risk of bugs, and makes your code more predictable. To write cleaner and more maintainable JavaScript, it's time to move on from var and embrace let and const.
Atas ialah kandungan terperinci ⚠️ Bahaya Tersembunyi Menggunakan `var` dalam JavaScript: Mengapa Tiba Masanya untuk Bergerak. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!