Rumah >hujung hadapan web >tutorial js >`ini` dalam JavaScript Explained
Ini ialah soalan #5 siri Soalan Temuduga Bahagian Depan. Jika anda ingin meningkatkan tahap persediaan anda atau kekal dikemas kini secara umum, pertimbangkan untuk mendaftar di Frontend Camp.
Kata kunci ini sentiasa merujuk kepada konteks semasa fungsi atau skrip.
ini adalah topik yang mengelirukan bagi kebanyakan kita (pun intended), tetapi ia tidak semestinya begitu. Anda hanya perlu mengingati beberapa peraturan.
Mengikut peraturan, mengikut keutamaan, menentukan cara nilai ini ditentukan semasa masa jalan:
Jika fungsi dipanggil dengan kata kunci baharu, bahagian dalam fungsi ini merujuk kepada contoh objek yang baru dibuat.
function Book(title) { console.log(this); this.title = title; console.log(this); } const book1 = new Book('Jungle Book'); // {} // { title: "'Jungle Book' }" console.log(book1.name); // 'Jungle Book'
call(), apply() atau bind() boleh digunakan untuk menetapkan nilai ini secara eksplisit di dalam fungsi.
const obj = { name: 'Ben' }; function sayHello() { console.log(`Hello, ${this.name}!`); } const sayHelloToBen = sayHello.bind(obj); sayHelloToBen(); // Hello, Ben! sayHello.call(obj); // Hello, Ben! sayHello.apply(obj); // Hello, Ben!
Jika fungsi ialah kaedah objek, maka ini merujuk kepada objek.
const person = { name: 'Ben', logThis: function() { console.log(this); } } person.logThis(); // { name: 'Ben', logThis: fn() }
Jika fungsi digunakan dalam konteks global, maka ini merujuk kepada objek global (dalam mod tidak ketat) atau tidak ditentukan (dalam mod ketat).
Untuk penyemak imbas, objek global ialah tetingkap.
// Browser function showThis() { console.log(this); } showThis(); // Window { open: fn, alert: fn, ... }
Apabila fungsi diisytiharkan dalam konteks global, ia menjadi hak milik objek tetingkap. Memanggil window.showThis() akan menghasilkan hasil yang sama. Inilah sebabnya mengapa ia merupakan penyeruan kaedah tersirat. (Rujuk peraturan di atas yang ini)
Jika berbilang peraturan dikenakan, maka peraturan dengan keutamaan yang lebih tinggi akan digunakan.
const obj1 = { value: 1, showThis: function() { console.log(this); }, }; const obj2 = { value: 2 }; obj1.showThis.call(obj2); // { value: 2 }
Dalam contoh di atas, dua peraturan sedang digunakan: Penyebutan kaedah dan Pengikatan Eksplisit. Memandangkan pengikatan eksplisit mempunyai keutamaan yang lebih tinggi, ia dapat menetapkan nilai ini.
Fungsi anak panah tidak mengikut peraturan yang dinyatakan di atas kerana ia tidak mempunyai nilai ini sendiri. Mereka memilih nilai ini daripada skop ibu bapa.
const person = { name: 'Ben', showThis: () => { console.log(this); }, showThisWrapped: function() { const arrowFn = () => console.log(this); arrowFn(); } } person.showThis(); // Window { open: fn, alert: fn, ... } person.showThisWrapped(); // { name: 'Ben', showThis: fn, showThisWrapped: fn }
Inilah sebabnya anda harus mengelak daripada menggunakan fungsi anak panah untuk pendengar acara. Pendengar acara mengikat elemen HTML pada nilai ini tetapi jika pengendali ialah fungsi anak panah, ia tidak boleh dilakukan.
function Book(title) { console.log(this); this.title = title; console.log(this); } const book1 = new Book('Jungle Book'); // {} // { title: "'Jungle Book' }" console.log(book1.name); // 'Jungle Book'
Suka dengan apa yang baru anda baca? Pertimbangkan untuk menyertai senarai tunggu di Frontend Camp ✌️
Atas ialah kandungan terperinci `ini` dalam JavaScript Explained. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!