javascript - Habituellement, tout le monde utilise des fonctions pour les fermetures. Et si j'utilise des objets ou des fermetures?
PHP中文网
PHP中文网 2017-05-19 10:42:53
0
3
629
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中文网

认证高级PHP讲师

répondre à tous(3)
淡淡烟草味

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~

滿天的星座

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

淡淡烟草味

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 = =

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!