JavaScript işlev ifadeleri bellekte nasıl saklanır?

Nov 23 2020
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

5 sp00m Nov 23 2020 at 17:53

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).

3 RanjeetThorat Nov 23 2020 at 18:43

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

2 FZs Nov 23 2020 at 18:16

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);