Gelagat Tidak Konsisten Operator "ini" dalam JavaScript
Operator "ini" dalam JavaScript boleh mempamerkan tingkah laku yang tidak konsisten disebabkan rujukannya yang berubah nilai bergantung pada konteks doa. Ini boleh menjadi masalah terutamanya apabila menggunakan kaedah objek sebagai fungsi panggil balik.
Corak Invokasi dan "ini"
Fungsi JavaScript boleh digunakan dalam empat cara:
Sebagai kaedah: Apabila dipanggil sebagai kaedah dalam objek, "ini" merujuk kepada objek itu sendiri.
const obj = { method() { console.log(this); // Logs the object }, }; obj.method();
Sebagai fungsi: Apabila dipanggil tanpa konteks tertentu, "ini" merujuk kepada objek global, biasanya objek tetingkap dalam penyemak imbas.
function fn() { console.log(this); // Logs the window object } fn();
Sebagai pembina: Apabila dipanggil menggunakan kata kunci baharu, "ini" merujuk kepada contoh kelas yang baru dibuat.
class MyClass { constructor() { console.log(this); // Logs an instance of MyClass } } new MyClass();
Dengan kaedah guna: Panggilan balik menggunakan corak seruan ini. "ini" boleh ditentukan dengan menghantar hujah pertama sebagai objek rujukan.
const obj = { method() { console.log(this); // Logs the object }, }; const fn = obj.method.bind(obj); fn(); // Logs the object
Gelagat Tidak Konsisten dalam Panggilan Balik
Ketidakkonsistenan timbul apabila kaedah sesuatu objek digunakan sebagai fungsi panggil balik. Oleh kerana panggilan balik digunakan sebagai fungsi, "ini" akan merujuk kepada objek global. Walau bagaimanapun, jangkaan adalah bahawa ia harus merujuk kepada objek yang dimiliki oleh kaedah tersebut.
Amalan Terbaik
Untuk mengelakkan ketidakkonsistenan ini, amalan terbaik berikut disyorkan:
Gunakan Fungsi Anak Panah: Fungsi anak panah mempunyai skop leksikal tersirat, bermakna ia mewarisi ikatan "ini" daripada konteks sekeliling. Ini menghapuskan keperluan untuk pengikatan yang jelas.
const obj = { method() { console.log(this); // Logs the object }, }; const fn = obj.method.bind(obj); setTimeout(fn, 1000); // Logs the object
Atas ialah kandungan terperinci Adakah Operator \'ini\' Sentiasa Merujuk kepada Objek Yang Dimaksudkan dalam JavaScript?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!