JavaScript işlev ifadeleri bellekte nasıl saklanır?
let sayBye = function () {
console.log(`Bye`);
}
let bye = sayBye;
sayBye = null; // X
bye(); // Y
Bu soruyu sormadan önce google'da arama yaptım ve bu yazıyı buldum .
Sonra X satırından önce yapı şuna benzer:
sayBye ---------------
|
| => function() {....}
|
bye-------------------
X çizgisinden sonra şöyle düşündüm:
sayBye MEMORY
| => function() {....}
|
bye-------------------
Ancak firefox geliştirici araçlarına güle güle yazdığımda bunu gördüm
Bu nasıl mümkün olaiblir? İ yazdığında let bye = sayBye;sayBye coppied edilir?
let sayBye = function () {
console.log(`Bye`);
}
let bye = sayBye;
sayBye = null; // X
bye(); // Y
console.log(bye);
Yanıtlar
Nereden https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/name#Inferred_function_names:
Değişkenler ve yöntemler, anonim bir işlevin adını sözdizimsel konumundan çıkarabilir (ECMAScript 2015'te yeni).
Chrome ve Firefox "sayBye", yazdırırken verir bye.name.
Kişisel deneylerden, Chrome konsolu bye.toString()sorarken gösterirken bye, Firefox kendi çıktısını gösterir ve burada işlevin türetilmiş adını gösterir (bu gerçekten mantıklıdır, çünkü adı bilmek genellikle hata ayıklamaya yardımcı olur).
Fonksiyonlar nesnedir, dolayısıyla x = y ataması kopyalanmaz. Elimdeki bu Nodej'leri denedim
Bye
[Function: sayBye]
Bir Function JS'ye isim vermezseniz, ona otomatik olarak isim ekleyecektir. ES6 size kullanarak fonksiyonun adını kontrol edebilirsiniz myFunction.name .Important şey bu olmasıdır bir fonksiyon nesnesi malıdır, yani 'adı' salt okunur özelliğini. İyi bir uygulama, işlev ifadesini kullanmak constyerine letkullanmaktır.Ayrıca, mümkünse, işlev hata ayıklamasını adlandırmaya çalışın çağrı yığınında kolaydır
Fonksiyonun adı kafanız karıştı.
Hafıza olayları tam olarak düşündüğünüz gibi gerçekleşir.
Bununla birlikte, işlevin açık bir adı yoktu, bu nedenle tarayıcı işleve örtük bir ad verdi , bu, bu durumda ilk atandığı değişken veya nesne özelliğinin adıdır sayBye.
Daha sonra farklı bir değişkene atanır, ancak isim değişmez.
Buna açık bir ad verirseniz bunu görebilirsiniz:
// Explicit name ----vvvv
let sayBye = function myFn() {
console.log(`Bye`);
}
let bye = sayBye;
sayBye = null; // X
bye(); // Y
console.log(bye);