Apakah ada cara dalam javascript untuk membuat "referensi lemah" ke objek lain? Berikut adalah halaman wiki yang menjelaskan apa itu referensi yang lemah. Berikut adalah artikel lain yang menjelaskannya di Java. Adakah yang bisa memikirkan cara untuk menerapkan perilaku ini di javascript?
javascript
weak-references
Stephen Cagle
sumber
sumber
Jawaban:
Tidak ada dukungan bahasa untuk weakrefs di JavaScript. Anda dapat menggulung sendiri menggunakan penghitungan referensi manual, tetapi tidak terlalu mulus. Anda tidak dapat membuat objek pembungkus proxy, karena dalam objek JavaScript tidak pernah tahu kapan objek tersebut akan dikumpulkan sampahnya.
Jadi 'referensi lemah' Anda menjadi kunci (mis. Bilangan bulat) dalam pencarian sederhana, dengan metode add-reference dan remove-reference, dan bila tidak ada referensi yang dilacak secara manual lagi, maka entri dapat dihapus, membiarkan pencarian selanjutnya pada kunci itu untuk mengembalikan null.
Ini sebenarnya bukan ref yang lemah, tetapi bisa menyelesaikan beberapa masalah yang sama. Ini biasanya dilakukan dalam aplikasi web yang kompleks untuk mencegah kebocoran memori dari browser (biasanya IE, terutama versi yang lebih lama) ketika ada loop referensi antara Node DOM atau pengendali kejadian, dan objek yang terkait dengannya seperti penutupan. Dalam kasus ini, skema penghitungan referensi penuh bahkan mungkin tidak diperlukan.
sumber
Saat menjalankan JS di NodeJS, Anda dapat mempertimbangkan https://github.com/TooTallNate/node-weak .
sumber
Pembaruan: September 2019
Referensi yang lemah belum dapat digunakan, tetapi kemungkinan besar akan segera dapat dilakukan, karena WeakRef di JavaScript sedang dalam proses. Detail di bawah.
Usul
Proposal saat ini dalam Tahap 3 yang berarti memiliki spesifikasi yang lengkap dan penyempurnaan lebih lanjut akan membutuhkan umpan balik dari implementasi dan pengguna.
The weakref usulan meliputi dua potong baru utama dari fungsi:
Kasus penggunaan
Sebuah penggunaan utama untuk referensi lemah adalah untuk menerapkan cache atau pemetaan memegang benda besar, di mana itu yang diinginkan bahwa sebuah objek besar tidak tetap hidup semata-mata karena muncul dalam cache atau pemetaan.
Finalisasi adalah eksekusi kode untuk membersihkan setelah objek menjadi tidak terjangkau untuk eksekusi program. Finalizer yang ditentukan pengguna mengaktifkan beberapa kasus penggunaan baru, dan dapat membantu mencegah kebocoran memori saat mengelola resource yang tidak diketahui oleh pengumpul sampah.
Sumber dan bacaan lebih lanjut
https://github.com/tc39/proposal-weakrefs
https://v8.dev/features/weak-references
sumber
Referensi benar-benar lemah, tidak, belum (tapi pembuat browser melihat subjeknya). Tapi di sini ada ide tentang bagaimana mensimulasikan referensi yang lemah.
Anda dapat membuat cache yang digunakan untuk mengarahkan objek Anda. Saat sebuah objek disimpan, cache menyimpan prediksi berapa banyak memori yang akan digunakan objek tersebut. Untuk beberapa item, seperti menyimpan gambar, ini langsung berhasil. Bagi orang lain ini akan lebih sulit.
Saat Anda membutuhkan sebuah objek, Anda kemudian meminta cache untuk itu. Jika cache memiliki objek, itu dikembalikan. Jika tidak ada, maka item dibuat, disimpan, dan kemudian dikembalikan.
Referensi yang lemah disimulasikan oleh item penghapus cache, ketika jumlah total memori yang diprediksi mencapai tingkat tertentu. Ini akan memprediksi item mana yang paling sedikit digunakan berdasarkan seberapa sering mereka diambil, tertimbang dengan berapa lama mereka dibawa keluar. Biaya 'kalkulasi' juga dapat ditambahkan, jika kode yang membuat item tersebut dimasukkan ke cache sebagai penutup. Ini akan memungkinkan cache menyimpan item yang sangat mahal untuk dibuat atau dibuat.
Algoritme penghapusan adalah kuncinya, karena jika Anda melakukan kesalahan ini maka Anda bisa menghapus item yang paling populer. Ini akan menyebabkan kinerja yang buruk.
Selama cache adalah satu-satunya objek dengan referensi permanen ke objek yang disimpan, maka sistem di atas akan bekerja dengan baik sebagai alternatif referensi lemah yang sebenarnya.
sumber
Hanya untuk referensi; JavaScript tidak memilikinya, tetapi ActionScript 3 (yang juga ECMAScript) memilikinya. Lihat parameter konstruktor untuk Kamus .
sumber
Menggunakan mekanisme caching untuk meniru referensi yang lemah, seperti yang disarankan JL235 di atas , adalah hal yang wajar. Jika referensi yang lemah akan ada secara asli, Anda akan mengamati perilaku seperti ini:
Sedangkan dengan cache Anda akan mengamati:
Sebagai pemegang referensi, Anda tidak boleh membuat asumsi apa pun tentang kapan itu merujuk ke suatu nilai, ini tidak berbeda dengan menggunakan cache
sumber
Akhirnya mereka ada disini. Belum diterapkan di browser, tetapi akan segera diterapkan.
https://v8.dev/features/weak-references
sumber
EcmaScript 6 (ES Harmony) memiliki objek WeakMap . Dukungan browser di antara browser modern cukup bagus (3 versi terakhir Firefox, chrome dan bahkan versi IE yang akan datang mendukungnya).
sumber
WeakMap
tidak memberikan referensi lemah ke objek-- bukan nilai yang menjadi referensi lemah di WeakMap, tetapi kuncinya . Fakta bahwa referensi yang lemah ada di peta hanyalah mekanisme pencegahan kebocoran memori, dan sebaliknya tidak dapat diamati oleh pengguna.weakmap.get(new String('any possible key that has ever existed or ever will exist'))
akan selalu demikianundefined
. Tidak berguna. Tidak memilih!http://www.jibbering.com/faq/faq_notes/closures.html
ECMAScript menggunakan pengumpulan sampah otomatis. Spesifikasi tidak menentukan detailnya, menyerahkannya kepada pelaksana untuk memilahnya, dan beberapa implementasi diketahui memberikan prioritas yang sangat rendah pada operasi pengumpulan sampahnya. Tetapi gagasan umumnya adalah bahwa jika sebuah objek menjadi tidak dapat dirujuk (dengan tidak memiliki referensi yang tersisa untuk itu dibiarkan dapat diakses untuk mengeksekusi kode) itu menjadi tersedia untuk pengumpulan sampah dan pada suatu saat akan dimusnahkan dan sumber daya apa pun yang dikonsumsinya dibebaskan dan dikembalikan ke sistem untuk digunakan kembali.
Ini biasanya akan menjadi kasus saat keluar dari konteks eksekusi. Struktur rantai cakupan, objek Aktivasi / Variabel, dan objek apa pun yang dibuat dalam konteks eksekusi, termasuk objek fungsi, tidak lagi dapat diakses dan akan tersedia untuk pengumpulan sampah.
Artinya tidak ada satu-satunya yang lemah yang tidak lagi tersedia.
sumber