Cet article explique en détail le calendrier et les méthodes de gestion de la mémoire et de publication par JavaScript et IE Browser, espérant être utile aux développeurs frontaux.
Une instance de version de mémoire
La copie de code est la suivante:
<Script linguisse = "javascript">
<! -
strTest = "1";
pour (var i = 0; i <25; i ++)
{
strTest + = strtest;
}
alerte (strtest);
Supprimer Strtest;
CollectRarbage ();
// ->
</cript>
CollectGarbage est une propriété unique de IE, utilisée pour libérer la mémoire. La méthode d'utilisation doit être: Définissez la variable ou l'objet de référence sur NULL ou DELETE, puis effectuer l'action de version.
Deux conditions nécessaires doivent être claires avant de faire CollectGarbage:
Référence - Un objet n'est pas valide en dehors du contexte dans lequel il vit.
- Un objet global ne sera pas valide s'il n'est pas exécuté (référencé).
La copie de code est la suivante:
// ---------------------------------------------------------
// Quand l'objet JavaScript échouera-t-il
// ---------------------------------------------------------
fonction testObject () {
var _obj1 = new object ();
}
fonction testObject2 () {
var _obj2 = new object ();
retour _OBJ2;
}
// Exemple 1
testObject ();
// Exemple 2
TestObject2 ()
// Exemple 3
var obj3 = testObject2 ();
obj3 = null;
// Exemple 4
var obj4 = testObject2 ();
var arr = [obj4];
obj3 = null;
arr = [];
Dans ces quatre exemples:
- "Exemple 1" construit _OBJ1 dans la fonction testObject (), mais lorsque la fonction quitte, il a quitté le contexte de la fonction, donc _OBJ1 est invalide;
- Dans "Exemple 2", un objet _OBJ2 est également construit dans TestObject2 () et évanoui, donc l'objet a un environnement de contexte (et une durée de vie) "en dehors de la fonction", mais comme la valeur de retour de la fonction n'est pas "maintenue" par d'autres variables, _OBJ2 est immédiatement invalide;
- Dans "Exemple 3", le _OBJ2 construit par testObject2 () est détenu par la variable externe OBJ3. À l'heure actuelle, jusqu'à ce que la ligne de code "obj3 = null" prenne effet, _OBJ2 ne sera pas invalide car la relation de référence disparaît.
- Pour la même raison que dans l'exemple 3, _obj2 dans "Exemple 4" ne sera pas invalide après la ligne de code "arr = []".
Cependant, "l'échec" de l'objet n'attend pas d'être "libéré". À l'intérieur de l'exécution JavaScript, il n'y a aucun moyen de dire à l'utilisateur exactement "Quand l'objet sera-t-il publié". Cela dépend du mécanisme de récupération de la mémoire de JavaScript. «Cette stratégie est similaire au mécanisme de recyclage de .NET.
Dans l'exemple d'exemple d'opération Excel précédent, le propriétaire de l'objet, c'est-à-dire "Excel.exe", ne se produira qu'après "la libération de l'instance d'objet ActiveX". Les verrous de fichiers et les informations d'autorisation d'autorisation du système d'exploitation sont liés au processus. Donc, si l'objet est uniquement "échoué" et non "non", alors d'autres processus auront des problèmes lors du traitement des fichiers et se référant aux informations d'identification du système d'exploitation.
- Certaines personnes disent que c'est un bug dans le mécanisme JavaScript ou com. En fait, ce n'est pas le cas. Cela est causé par une relation complexe entre le système d'exploitation, IE et JavaScript, plutôt qu'un problème indépendant.
Microsoft a exposé une stratégie pour résoudre ce problème: appeler de manière proactive le processus de recyclage de la mémoire.
Un processus collectiongarbage () (généralement appelé le processus GC) est fourni dans (Microsoft) JScript. Le processus GC est utilisé pour nettoyer le "désalignement de l'objet défaillant" dans le Current IE, c'est-à-dire le processus de destructeur d'appel de l'objet.
Dans l'exemple ci-dessus, le code qui appelle la procédure GC est:
La copie de code est la suivante:
// ---------------------------------------------------------
// Méthode d'appel standard des procédures GC lors du traitement de l'objet ActiveX
// ---------------------------------------------------------
function writexls () {
//(légèrement...)
excel.quit ();
Excel = null;
setTimeout (collectiongarbage, 1);
}
La première ligne de code appelle la méthode excel.quit () pour faire avorter et quitter le processus Excel. Pour le moment, comme l'environnement JavaScript a une instance d'objet Excel, le processus Excel ne s'aborte pas réellement.
La deuxième ligne de code rend Excel Null pour effacer les références d'objet, "invalidant" l'objet. Cependant, comme l'objet est toujours dans le contexte de la fonction, si la procédure GC est appelée directement, l'objet ne sera toujours pas nettoyé.
La troisième ligne de code utilise SetTimeout () pour appeler la fonction CollectRarbage, et l'intervalle de temps est défini sur «1», ce qui a fait que le processus GC se déroule après l'exécution de la fonction writexls (). De cette façon, l'objet Excel répond à deux conditions de "peut être nettoyé par GC": aucune référence et quittant le contexte.
L'utilisation des procédures GC est très efficace dans les environnements JS à l'aide d'objet ActiveX. Certains potentiels ActiveXObjects incluent XML, VML, OWC (Office Web Componet), Flash et même VBarray dans JS. De ce point de vue, car l'architecture Ajax adopte XMLHTTP et doit également répondre à la fonction "sans commutation de page", appeler activement le processus GC à des moments appropriés vous offrira une meilleure expérience d'efficacité en utilisant l'interface utilisateur.
En fait, même avec le processus GC, le problème Excel susmentionné ne sera pas complètement résolu. Parce que IE cache également les titres d'autorisation. La seule façon de mettre à jour les informations d'autorisation de la page est de "passer à une nouvelle page",
Par conséquent, en fait, dans le projet SPS mentionné ci-dessus, la méthode que j'ai utilisée n'était pas GC, mais le code suivant:
La copie de code est la suivante:
// ---------------------------------------------------------
// Code de commutation de page utilisé lors du traitement de l'objet ActiveX
// ---------------------------------------------------------
function writexls () {
//(légèrement...)
excel.quit ();
Excel = null;
// Le code suivant est utilisé pour résoudre un bogue dans IE Call Excel, la méthode fournie dans MSDN:
// setTimeout (collectiongarbage, 1);
// Étant donné que l'état de confiance de la page Web ne peut pas être effacé (ou synchronisé) provoquera Saveas () et d'autres méthodes
// non valide la prochaine fois que vous l'appelez.
emplacement.reload ();
}
Description de la suppression de l'opérateur en manuel
La référence supprime un attribut d'un objet ou supprime un élément d'un tableau.
Supprimer l'expression
Le paramètre d'expression est une expression JScript valide, généralement un nom de propriété ou un élément de tableau.
illustrer
Si le résultat de l'expression est un objet et que l'attribut spécifié dans l'expression existe, et que l'objet ne lui permet pas d'être supprimé, FALSE est renvoyé.
Dans tous les autres cas, revenez vrai.
Enfin, une note supplémentaire sur GC: lorsque la forme IE sera minimisée, IE appellera activement la fonction collectiongarbage () une fois. Cela rend l'utilisation de la mémoire considérablement améliorée après la minimisation de la fenêtre IE