В этой статье подробно объясняются время и методы управления памятью и выпуска JavaScript и IE Browser, надеясь быть полезными для разработчиков фронта.
Экземпляр выпуска памяти
Кода -копия выглядит следующим образом:
<Script language = "javascript">
<!-
Strtest = "1";
для (var i = 0; i <25; i ++)
{
Strtest += Strtest;
}
предупреждение (Strtest);
Удалить Strtest;
Colleggarbage ();
//->
</Script>
Colleggarbage - это уникальное свойство IE, используемое для выпуска памяти. Метод использования должен быть: Установите переменную или ссылочный объект в NULL или DELETE, а затем выполните действие выпуска.
Перед тем, как сделать Collegarbage: две необходимые условия:
Ссылка - объект недействителен вне контекста, в котором он живет.
- Глобальный объект будет недействительным, если он не будет выполнен (ссылка).
Кода -копия выглядит следующим образом:
// ---------------------------------------------------------
// Когда потерпит неудачу JavaScript
// ---------------------------------------------------------
функция testObject () {
var _obj1 = new Object ();
}
функция testObject2 () {
var _obj2 = new Object ();
вернуть _obj2;
}
// Пример 1
testObject ();
// Пример 2
testObject2 ()
// Пример 3
var obj3 = testObject2 ();
obj3 = null;
// Пример 4
var obj4 = testObject2 ();
var arr = [obj4];
obj3 = null;
arr = [];
В этих четырех примерах:
- «Пример 1» конструирует _obj1 в функции TestObject (), но когда функция выходит, она оставила контекст функции, поэтому _Obj1 является недействительным;
- В «Примере 2» объект _OBJ2 также построен в TestObject2 () и передается, поэтому объект имеет контекстную среду (и время жизни) «вне функции», но поскольку возвратное значение функции не «удерживается» другими переменными, _OBJ22 сразу же недопустимо;
- В «Примере 3» _OBJ2, построенный с помощью TestObject2 (), удерживается внешней переменной oBJ3. В настоящее время, пока строка кода «obj3 = null» вступит в силу, _obj2 не будет недействительной, поскольку эталонные отношения исчезают.
- По той же причине, что и в примере 3, _OBJ2 в «Примере 4» не будет недействительным после строки кода «arr = []».
Тем не менее, «сбой» объекта не ждет, чтобы его выпустили ». Внутри времени выполнения JavaScript невозможно сказать пользователю точно «когда будет выпущен объект». Это зависит от механизма восстановления памяти JavaScript. «Эта стратегия похожа на механизм переработки в .NET.
В предыдущем примере примера операции Excel владелец объекта, то есть «Excel.exe», будет происходить только после «выпуска экземпляра объекта ActiveX». Файл блокирует и учетные данные операционной системы связаны с процессом. Таким образом, если объект находится только «неудачным», а не «выпуск», то другие процессы будут иметь проблемы при обработке файлов и ссылке на учетные данные разрешения операционной системы.
- Некоторые люди говорят, что это ошибка в JavaScript или COM механизм. На самом деле, это не так. Это вызвано сложной отношением между ОС, IE и JavaScript, а не независимой проблемой.
Microsoft выявила стратегию для решения этой проблемы: активно вызовать процесс утилизации памяти.
Процесс Collegarbage () (обычно называемый процессом GC) представлен в (Microsoft) JScript. Процесс GC используется для очистки «неудачного смещения объекта» в текущем т.е.
В приведенном выше примере код, который вызывает процедуру GC:
Кода -копия выглядит следующим образом:
// ---------------------------------------------------------
// Стандартный метод вызова процедур GC при обработке объекта ActiveX
// ---------------------------------------------------------
функция writexls () {
//(немного...)
Excel.quit ();
Excel = null;
SetTimeout (Collegarbage, 1);
}
Первая строка кода вызывает метод Excel.quit (), чтобы процесс Excel прервался и выходил. В настоящее время, поскольку среда JavaScript имеет экземпляр объекта Excel, процесс Excel фактически не прерывает.
Вторая строка кода делает Excel Null для очистки ссылок на объект, таким образом, «недействительным» объекта. Однако, поскольку объект все еще находится в контексте функции, если процедура GC называется непосредственно, объект все равно не будет очищен.
Третья строка кода использует settimeout () для вызова функции Collegarbage, а интервал времени устанавливается на «1», что делает процесс GC только после выполнения функции writexls (). Таким образом, объект Excel соответствует двум условиям «может быть очищена GC»: нет ссылки и оставить контекст.
Использование процедур GC очень эффективно в средах JS с использованием объекта ActiveX. Некоторые потенциальные ActivexObjects включают XML, VML, OWC (Office Web Componet), Flash и даже Vbarray в JS. С этой точки зрения, поскольку архитектура AJAX принимает XMLHTTP, а также необходимо выполнить функцию «без переключения страниц», активно вызывая процесс GC в подходящее время, даст вам лучший опыт эффективности с использованием пользовательского интерфейса.
Фактически, даже с процессом GC, вышеупомянутая проблема Excel не будет полностью решена. Потому что т.е. также кэширует разрешения. Единственный способ обновить учетные данные о разрешении страницы - это «переключиться на новую страницу»,
Поэтому, на самом деле, в проекте SPS, упомянутом выше, метод, который я использовал, был не GC, а следующим кодом:
Кода -копия выглядит следующим образом:
// ---------------------------------------------------------
// код переключения страниц, используемый при обработке объекта ActiveX
// ---------------------------------------------------------
функция writexls () {
//(немного...)
Excel.quit ();
Excel = null;
// Следующий код используется для решения ошибки в IE CALL Excel, метод, предоставленный в MSDN:
// setTimeout (colleggarbage, 1);
// Поскольку доверенное состояние веб -страницы не может быть очищено (или синхронизировано) привести к тому, что Saveas () и другие методы будут
// недействителен в следующий раз, когда вы это позвоните.
location.reload ();
}
Описание оператора удаления в руководстве
Ссылка удаляет атрибут из объекта или удаляет элемент из массива.
Удалить выражение
Параметр выражения является действительным выражением JScript, обычно именем свойства или элементом массива.
иллюстрировать
Если результат выражения является объектом, а атрибут, указанный в выражении, существует, и объект не позволяет его удалять, FALSE возвращается.
Во всех других случаях вернуть правду.
Наконец, дополнительная примечание о GC: когда форма IE будет сведена к минимуму, т.е. активно назовет функцию Collegarbress () один раз. Это значительно улучшается использование памяти после минимума окна IE