Rumah > hujung hadapan web > tutorial js > Mengapakah Gelung JavaScript Mencipta Gelagat Tidak Dijangka Apabila Mengikat Pengendali Acara?

Mengapakah Gelung JavaScript Mencipta Gelagat Tidak Dijangka Apabila Mengikat Pengendali Acara?

Linda Hamilton
Lepaskan: 2024-12-24 20:40:13
asal
788 orang telah melayarinya

Why Do JavaScript Loops Create Unexpected Behavior When Binding Event Handlers?

Memahami Isu Gelung JavaScript Yang Terkenal

Dalam JavaScript, isu biasa timbul apabila menggunakan gelung untuk menjana elemen dan mengikatnya kepada pengendali acara . Kod berikut menunjukkan masalah ini:

function addLinks() {
    for (var i=0, link; i<5; i++) {
        link = document.createElement("a");
        link.innerHTML = "Link " + i;
        link.onclick = function () {
            alert(i);
        };
        document.body.appendChild(link);
    }
}
Salin selepas log masuk

Kod ini bertujuan untuk menjana 5 pautan, setiap satu memaparkan indeksnya sendiri apabila diklik. Walau bagaimanapun, apabila diklik, semua pautan akan memaparkan "pautan 5." Anomali ini berpunca daripada mekanisme penutupan dalam JavaScript.

Dalam coretan pertama, fungsi dalaman yang ditakrifkan dalam pengendali peristiwa gelung mengekalkan rujukan kepada pembolehubah i. Walau bagaimanapun, selepas gelung selesai, saya menganggap nilai 5. Akibatnya, apabila pengendali acara memanggil amaran(i), nilai i sentiasa 5, mengakibatkan tingkah laku yang salah.

Dalam kod kedua coretan, isu ini diselesaikan dengan melampirkan fungsi dalaman dalam ungkapan fungsi yang dipanggil serta-merta (IIFE):

link.onclick = function (num) {
    return function () {
        alert(num);
    };
}(i);
Salin selepas log masuk

The IIFE memastikan bahawa contoh baharu fungsi dalaman dicipta untuk setiap lelaran, dengan itu mengekalkan nilai i yang dikehendaki dalam skopnya. Apabila pengendali acara melaksanakan, ia memaklumkan indeks yang betul menggunakan nilai tangkapan i daripada IIFE.

Sebagai alternatif, pendekatan yang lebih cekap adalah untuk menetapkan nilai semasa i terus kepada sifat nod DOM, membolehkan akses mudah semasa pelaksanaan pengendali acara:

link.i = i;
link.onclick = function () {
    alert(this.i);
};
Salin selepas log masuk

Penyelesaian ini menghapuskan keperluan untuk mencipta objek fungsi baharu bagi setiap pautan.

Atas ialah kandungan terperinci Mengapakah Gelung JavaScript Mencipta Gelagat Tidak Dijangka Apabila Mengikat Pengendali Acara?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan