Maison > Questions et réponses > le corps du texte
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. . . .
淡淡烟草味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~
滿天的星座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é.
淡淡烟草味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 = =