Este artículo explica en detalle el tiempo y los métodos de gestión de memoria y lanzamiento de JavaScript e IE Browser, con la esperanza de ser útiles para los desarrolladores frontales.
Una instancia de versión de memoria
La copia del código es la siguiente:
<Script language = "javaScript">
<!-
strtest = "1";
para (var i = 0; i <25; i ++)
{
strtest += strtest;
}
alerta (strtest);
eliminar strtest;
COLECTAGARGE ();
//->
</script>
CollectArgage es una propiedad única de IE, que se usa para liberar la memoria. El método de uso debe ser: Establecer la variable o objeto de referencia en nulo o eliminar, y luego realizar la acción de liberación.
Dos condiciones necesarias deben ser claras antes de hacer recolectionGarbage:
Referencia: un objeto no es válido fuera del contexto en el que vive.
- Un objeto global no será válido si no se ejecuta (referenciado).
La copia del código es la siguiente:
// ---------------------------------------------------------
// cuando fallará el objeto JavaScript
// ---------------------------------------------------------
función testObject () {
var _obj1 = nuevo objeto ();
}
función testObject2 () {
var _obj2 = nuevo objeto ();
return _obj2;
}
// Ejemplo 1
testObject ();
// Ejemplo 2
testObject2 ()
// Ejemplo 3
var obj3 = testObject2 ();
obj3 = nulo;
// Ejemplo 4
var obj4 = testObject2 ();
var arr = [obj4];
obj3 = nulo;
arr = [];
En estos cuatro ejemplos:
- "Ejemplo 1" construye _obj1 en la función testObject (), pero cuando la función sale, ha dejado el contexto de la función, por lo que _obj1 no es válido;
- En "Ejemplo 2", un objeto _OBJ2 también se construye en testObject2 () y se desmaya, por lo que el objeto tiene un entorno de contexto (y vida útil) "fuera de la función", pero dado que el valor de retorno de la función no está "retenido" por otras variables, _obj2 es inmediatamente inválido;
- En "Ejemplo 3", el _OBJ2 construido por testObject2 () está en poder de la variable externa OBJ3. En este momento, hasta que la línea de código "obj3 = nulo" surte efecto, _obj2 no será inválida porque la relación de referencia desaparece.
- Por la misma razón que en el Ejemplo 3, _obj2 en "Ejemplo 4" no será inválido después de la línea de código "arr = []".
Sin embargo, el "fracaso" del objeto no espera ser "liberado". Dentro del tiempo de ejecución de JavaScript, no hay forma de decirle al usuario exactamente "cuándo se lanzará el objeto". Esto depende del mecanismo de recuperación de memoria de JavaScript. “Esta estrategia es similar al mecanismo de reciclaje en .NET.
En el código de ejemplo de Operación de Excel anterior, el propietario del objeto, es decir, "Excel.exe", solo ocurrirá después de la "liberación de la instancia de objeto ActiveX". Los bloqueos de archivo y las credenciales de permiso del sistema operativo están relacionadas con el proceso. Entonces, si el objeto solo está "fallido" y no "liberan", entonces otros procesos tendrán problemas al procesar archivos y referirse a las credenciales de permiso del sistema operativo.
- Algunas personas dicen que este es un error en el mecanismo JavaScript o COM. En realidad, no lo es. Esto es causado por una relación compleja entre OS, IE y JavaScript, en lugar de un problema independiente.
Microsoft ha expuesto una estrategia para resolver este problema: llame proactivamente al proceso de reciclaje de memoria.
Se proporciona un proceso CollectGarbage () (generalmente conocido como el proceso GC) en JScript (Microsoft). El proceso de GC se utiliza para limpiar la "desalineación de objetos fallido" en el IE actual, es decir, el proceso destructor de llamar al objeto.
En el ejemplo anterior, el código que llama al procedimiento GC es:
La copia del código es la siguiente:
// ---------------------------------------------------------
// Método de llamadas estándar de los procedimientos GC al procesar el objeto ActiveX
// ---------------------------------------------------------
función writexls () {
//(levemente...)
Excel.quit ();
Excel = nulo;
setTimeOut (recolectionGarbage, 1);
}
La primera línea de código llama al método Excel.quit () para hacer que el proceso de Excel aborta y salga. En este momento, dado que el entorno JavaScript tiene una instancia de objeto de Excel, el proceso de Excel en realidad no aborta.
La segunda línea de código hace que Excel nula para borrar las referencias de los objetos, así que "invalidando" al objeto. Sin embargo, dado que el objeto todavía está en el contexto de la función, si el procedimiento GC se llama directamente, el objeto aún no se limpiará.
La tercera línea de código usa setTimeOut () para llamar a la función de recolección de basura, y el intervalo de tiempo se establece en '1', lo que solo hace que el proceso GC ocurra después de ejecutar la función writexls (). De esta manera, el objeto Excel cumple dos condiciones de "puede ser limpiado por GC": sin referencia y dejar el contexto.
El uso de procedimientos GC es muy efectivo en entornos JS utilizando el objeto ActiveX. Algunos posibles activos de activo incluyen XML, VML, OWC (Office Web Componet), Flash e incluso VBarray en JS. Desde este punto de vista, debido a que la arquitectura AJAX adopta XMLHTTP y también necesita cumplir con la característica de "sin conmutación de páginas", llamar activamente el proceso GC en los momentos apropiados le dará una mejor experiencia de eficiencia utilizando la interfaz de usuario.
De hecho, incluso con el proceso GC, el problema de Excel mencionado no se resolverá por completo. Porque IE también almacena credenciales de permiso. La única forma de actualizar las credenciales de permiso de la página es "cambiar a una nueva página",
Por lo tanto, de hecho, en el proyecto SPS mencionado anteriormente, el método que utilicé no fue GC, sino el siguiente código:
La copia del código es la siguiente:
// ---------------------------------------------------------
// código de conmutación de página utilizado al procesar el objeto ActiveX
// ---------------------------------------------------------
función writexls () {
//(levemente...)
Excel.quit ();
Excel = nulo;
// El siguiente código se usa para resolver un error en IE Call Excel, el método proporcionado en MSDN:
// settimeout (coleccionador de basura, 1);
// Dado que el estado confiable de la página web no se puede borrar (o sincronizar) hará que Saveas () y otros métodos sean
// Inválido la próxima vez que lo llame.
ubicación.reload ();
}
Descripción del operador de eliminación en manual
La referencia elimina un atributo de un objeto o elimina un elemento de una matriz.
Eliminar expresión
El parámetro de expresión es una expresión de JScript válida, generalmente un nombre de propiedad o un elemento de matriz.
ilustrar
Si el resultado de la expresión es un objeto y el atributo especificado en la expresión existe, y el objeto no permite que se elimine, se devuelve el falso.
En todos los demás casos, devuelve verdadero.
Finalmente, una nota suplementaria sobre GC: cuando se minimiza el formulario IE, es decir, llamará activamente a la función CollectArgage () una vez. Esto hace que el uso de la memoria mejore significativamente después de que se minimice la ventana de IE.