Salah satu kata kunci yang paling keliru dalam JavaScript ialah kata kunci ini. Ia ialah kata kunci pengecam khas yang ditakrifkan secara automatik dalam skop setiap fungsi, tetapi apa sebenarnya yang dirujuk untuk mengelirukan walaupun pembangun JavaScript yang berpengalaman.
Kata kunci ini merujuk kepada konteks di mana sekeping kod, seperti badan fungsi, sepatutnya dijalankan. Lazimnya, ia digunakan dalam kaedah objek, di mana ini merujuk kepada objek yang dilampirkan kaedah, sekali gus membenarkan kaedah yang sama digunakan semula pada objek yang berbeza.
Nilai ini boleh dikenal pasti di mana fungsi dilaksanakan bukan di mana fungsi diisytiharkan
Kami akan memeriksa peraturan yang berbeza untuk mengenal pasti ini dalam javascript
Peraturan lalai kami akan menggunakan kes panggilan fungsi yang paling biasa: pelaksanaan fungsi kendiri. Fikirkan peraturan ini sebagai peraturan catch-all lalai apabila tiada peraturan lain digunakan.
Dalam fungsi kendiri panggil nilai ini akan menjadi globalObject (dalam pelayar env ia adalah objek tetingkap, dalam nod env ia akan menjadi global)
function bar() { console.log(this) // this will be global object (window) } bar()
Tetapi......
nilai ini boleh berbeza cara kod berjalan dalam mod ketat atau mod tidak ketat
Jika Apabila fungsi digunakan sebagai fungsi kendiri, ini biasanya merujuk kepada objek global dalam mod tidak ketat dan tidak ditentukan dalam mod ketat
"use strict" function bar() { console.log(this) // undefined } bar()
Halus tetapi penting, objek global hanya layak untuk pengikatan lalai jika kandungan bar() tidak berjalan dalam mod ketat;
function bar() { console.log(this) // global object (window) } (function() { "use strict" bar() })()
Apabila fungsi biasa digunakan sebagai kaedah objek (obj.method()), ini menghala ke objek itu.
function bar() { console.log(this) } const obj = { name: "javascript", foo } obj.foo() // this here is object owing the function
Mula-mula, perhatikan cara bar() diisytiharkan dan kemudian ditambahkan sebagai sifat rujukan pada obj. Tidak kira sama ada foo() pada mulanya diisytiharkan pada obj, atau ditambah sebagai rujukan kemudian (seperti yang ditunjukkan oleh coretan ini), dalam kedua-dua kes fungsi itu tidak benar-benar "dimiliki" atau "terkandung" oleh objek obj.
Hilang tersirat:
Apabila menggunakan panggil balik, fungsi terikat secara tersirat kehilangan pengikatan itu, yang biasanya bermakna ia kembali kepada pengikatan lalai, sama ada objek global atau tidak ditentukan, bergantung pada mod ketat.
function bar() { setTimeout(function() { console.log(this) // this will be global object }, 1000); } const obj = { name: "javascript", bar } obj.bar() // this will be global object
function bar() { console.log(this) } const obj = { name: "javascript", bar } const a = obj.bar a() // this will be global object
Dengan pengikatan tersirat seperti yang baru kita lihat, kami terpaksa memutasi objek yang dipersoalkan untuk menyertakan rujukan pada dirinya sendiri kepada fungsi tersebut dan menggunakan rujukan fungsi sifat ini untuk mengikat ini secara tidak langsung (secara tersirat) pada objek.
Tetapi, bagaimana jika anda mahu memaksa panggilan fungsi untuk menggunakan objek tertentu untuk pengikatan ini, tanpa meletakkan rujukan fungsi sifat pada objek?
Ya mungkin, javascript menyediakan banyak kaedah seperti .map, .filter untuk tatasusunan kami mempunyai beberapa kaedah dalam fungsi. Ini berlaku , panggil dan ikat
Berikut ialah sintaks untuk kaedah ini
panggil
function bar() { console.log(this) // this will be global object (window) } bar()
mohon
"use strict" function bar() { console.log(this) // undefined } bar()
Perbezaan halus antara memohon dan memanggil. Sintaks adalah sama tetapi kami menghantar argumen sebagai tatasusunan dalam kaedah penggunaan
function bar() { console.log(this) // global object (window) } (function() { "use strict" bar() })()
Memanggil bar dengan pengikatan eksplisit oleh bar.call(..) membolehkan kami memaksa ini menjadi obj.
Apabila fungsi digunakan sebagai pembina (dengan kata kunci baharu), ia terikat pada objek baharu yang sedang dibina, tidak kira objek mana fungsi pembina diakses. Nilai ini menjadi nilai ungkapan baharu melainkan pembina mengembalikan nilai bukan primitif yang lain.
function bar() { console.log(this) } const obj = { name: "javascript", foo } obj.foo() // this here is object owing the function
Atas ialah kandungan terperinci kata kunci ini dalam javascript. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!