Kesalahan Merujuk Huruf Objek Dalam Fungsi Bersarang
Menggunakan literal objek untuk pengkapsulan data yang cepat dan mudah ialah amalan biasa dalam JavaScript. Walau bagaimanapun, adalah penting untuk mengetahui potensi isu yang timbul apabila merujuk objek literal dalam fungsi yang ditakrifkan dalam literal itu sendiri.
Masalah "ini"
Masalah "ini" kebimbangan utama berpunca daripada penggunaan kata kunci "ini" dalam fungsi bersarang. Secara lalai, "ini" menunjuk ke objek global (tetingkap) jika fungsi itu tidak dipanggil sebagai kaedah objek. Ini boleh membawa kepada gelagat yang tidak dijangka apabila mengakses sifat objek.
Contoh:
Pertimbangkan coretan kod berikut:
var obj = { key1: "it", key2: function() { return this.key1 + " works"; } };
Kod ini nampaknya mudah, tetapi output mungkin tidak seperti yang anda harapkan. Jika "key2" dipanggil sebagai fungsi kendiri (iaitu, bukan sebagai kaedah "obj"), "ini" akan merujuk kepada objek global, mengakibatkan ralat masa jalan.
Satu lagi Perangkap : Kebocoran Rujukan
Satu lagi isu berpotensi timbul apabila objek literal diubah suai atau diganti sementara fungsi bersarang masih mengekalkan merujuk kepada objek asal. Ini boleh menyebabkan fungsi tidak berfungsi disebabkan rujukan yang sudah lapuk.
Contoh:
Pertimbangkan kod ini:
var obj = { key1: "it", key2: function() { return obj.key1 + " works"; } }; var newRef = obj; obj = { key1: "something else"; };
Dalam kes ini, " key2" masih merujuk kepada objek "obj" asal, yang telah diganti. Ini bermakna panggilan "key2" akan mengembalikan nilai yang salah ("sesuatu yang lain berfungsi" dan bukannya "ia berfungsi").
Penyelesaian:
Untuk memastikan tingkah laku yang boleh dipercayai dan elakkan perangkap ini, secara amnya dinasihatkan untuk menyimpan objek dalam pembolehubah tempatan dalam fungsi atau mengikat fungsi ke objek secara eksplisit menggunakan "bind()". Ini memastikan bahawa fungsi mengekalkan konteks yang betul dan boleh mengakses sifat objek dengan tepat.
Terdapat juga kaedah untuk menghalang objek literal itu sendiri daripada diubah suai atau diganti, memberikan perlindungan lanjut terhadap kebocoran rujukan.
Atas ialah kandungan terperinci Mengapakah Fungsi Bersarang dalam Literal Objek JavaScript menimbulkan \'ini\' dan Masalah Kebocoran Rujukan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!