Rumah  >  Soal Jawab  >  teks badan

javascript - Biasanya semua orang menggunakan fungsi untuk penutupan Bagaimana jika saya menggunakan objek atau penutupan?

let a = [];
function test1(){
    let ta = Math.random();
    let tb = "test2";
    let obj1 = {
        t1: ta
    }
    a.push(obj1);
}

test1();
        

Adakah fungsi test1 masih mengeluarkan memori selepas memanggilnya seperti ini?
Pembolehubah global a mengandungi rujukan kepada objek, yang berada dalam ujian fungsi1 Mengapa saya fikir ujian1 tidak akan melepaskan memori? Tolong beri saya nasihat. . . .

PHP中文网PHP中文网2710 hari yang lalu641

membalas semua(3)saya akan balas

  • 淡淡烟草味

    淡淡烟草味2017-05-19 10:44:53

    a dan test1 berkongsi konteks larian, iaitu a dan test1 wujud bersama dan mati~
    Saya tidak tahu jika pemahaman saya salah~Contohnya:

    function test() {
        let a = [];
        function test1(){
            let ta = Math.random();
            let tb = "test2";
            let obj1 = {
                t1: ta
            }
            a.push(obj1);
        }
        test1();
    }
    test();

    Selepas melaksanakan ujian, saya rasa ujian1 akan dikeluarkan, dan ujian juga akan dikeluarkan.
    Jika ia tiada dalam fungsi tetapi terus di bawah tetingkap, test1 akan sentiasa wujud~

    balas
    0
  • 滿天的星座

    滿天的星座2017-05-19 10:44:53

    Saya salah faham sebelum ini, ini sepatutnya menjadi dua masalah.

    Selepas pelaksanaan, pembolehubah test1 tidak dirujuk secara langsung, jadi persekitaran pelaksanaan test1, iaitu konteks, harus dikitar semula. Ini bukan penutupan. Selain itu, badan fungsi test1 itu sendiri adalah atribut yang dimiliki oleh konteks di mana ia berada selagi konteks masih ada, badan fungsi itu sendiri tidak akan dikitar semula.

    balas
    0
  • 淡淡烟草味

    淡淡烟草味2017-05-19 10:44:53

    Mari kita bercakap tentang kesimpulan dahulu, bukan
    Pertama sekali, definisi penutupan adalah fungsi yang boleh mengakses pembolehubah bebas, yang tidak konsisten dengan definisi

    Jika pemahaman anda salah
    Sila ubah contoh anda

    let a = [];
    function test1(){
        let ta = Math.random();
        let tb = "test2";
        let obj1 = {
            t1: ta
        }
        return obj1;
    }
    a.push(test1())
    Objek yang ditunjuk oleh

    original obj1 juga wujud dalam a, tetapi adakah anda fikir ini masih merupakan penutupan?

    Dalam contoh anda, selepas test1 dilaksanakan, ta, tb, dan obj1 semuanya dilepaskan
    Objek yang ditunjuk oleh pembolehubah obj1 yang dicipta di dalamnya ditambah kepada pembolehubah global a kepada objek ini. Memandangkan objek ini dirujuk oleh a[0], ia tidak akan dilepaskan, tetapi ia tiada kaitan dengan obj1 Skop obj1 tidak berubah semasa keseluruhan proses ditunjuk oleh obj1 dan bukannya obj1

    Saya tidak tahu sama ada anda boleh memahami ini kemahiran bahasa Cina saya sangat lemah sehingga saya rasa saya tidak dapat menerangkan dengan jelas = =

    balas
    0
  • Batalbalas