Maison  >  Questions et réponses  >  le corps du texte

javascript - Habituellement, tout le monde utilise des fonctions pour les fermetures. Et si j'utilise des objets ou des fermetures?

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

test1();
        

La fonction test1 libérera-t-elle toujours de la mémoire après l'avoir appelée ainsi ?
La variable globale a contient une référence à un objet, qui se trouve dans la fonction test1. Pourquoi est-ce que je pense que test1 ne libérera pas la mémoire ? S'il vous plaît, donnez-moi quelques conseils. . . .

PHP中文网PHP中文网2710 Il y a quelques jours642

répondre à tous(3)je répondrai

  • 淡淡烟草味

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

    a et test1 partagent un contexte d'exécution, c'est-à-dire que a et test1 coexistent et meurent~
    Je ne sais pas si j'ai mal compris~Par exemple :

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

    Après avoir exécuté le test, je pense que test1 sera publié, et a sera également publié.
    S'il n'est pas dans une fonction mais directement sous la fenêtre, test1 existera toujours~

    répondre
    0
  • 滿天的星座

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

    J'ai mal compris avant, cela devrait poser deux problèmes.

    Après l'exécution, les variables de test1 ne sont pas directement référencées, donc l'environnement d'exécution de test1, c'est-à-dire le contexte, doit être recyclé. Ce n'est pas une fermeture. De plus, le corps de fonction de test1 lui-même est un attribut appartenant au contexte dans lequel il se trouve. Tant que le contexte est toujours là, le corps de fonction lui-même ne sera pas recyclé.

    répondre
    0
  • 淡淡烟草味

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

    Parlons d'abord de la conclusion, n'est-ce pas
    Tout d'abord, la définition de la fermeture est une fonction qui peut accéder à des variables libres, ce qui est incompatible avec la définition

    Si vous avez mal compris
    Veuillez modifier votre exemple

    let a = [];
    function test1(){
        let ta = Math.random();
        let tb = "test2";
        let obj1 = {
            t1: ta
        }
        return obj1;
    }
    a.push(test1())
    L'objet pointé par

    original obj1 existe également dans a, mais pensez-vous qu'il s'agit toujours d'une fermeture ?

    Dans votre exemple, après l'exécution de test1, ta, tb et obj1 sont tous libérés.
    L'objet pointé par la variable obj1 qui y est créée est ajouté à la variable globale a. Après l'exécution de test1, a[0] Points. à cet objet. Puisque cet objet est référencé par a[0], il ne sera pas publié, mais cela n'a rien à voir avec obj1 La portée de obj1 n'a pas changé pendant tout le processus. pointé par l'objet obj1 au lieu de obj1

    .

    Je ne sais pas si vous pouvez comprendre cela. Mes compétences en chinois sont trop faibles et j'ai l'impression de ne pas pouvoir parler clairement = =

    répondre
    0
  • Annulerrépondre