Genome_X
@Genome_X

Как исправить memory leak in IE при удалении и повторном создании переменной?

Собственно, вопрос.

Использую jQuery, есть код вида:



$(&quot;id&quot;).click(function() {<br/>
 if (&quot;perem1&quot; in window && &quot;perem2&quot; in window) {<br/>
 #someaction;<br/>
 delete perem1;<br/>
 delete perem2;<br/>
 } else {<br/>
 perem1= somevalue;<br/>
 perem2= somevalue;<br/>
 };<br/>




Т.е. смысл такой: скрипт проверяет наличие глобальных переменных perem1 и perem2, если не находит их, то выполняет условие после else, т.е. создает глобальные переменные и присваивает им некоторые значения. При повторном вызове функции условие дает TRUE, выполняется некий код #someaction где участвуют значения этих переменных, затем переменные удаляются.



В браузерах FF, Opera все работает корректно. Но вот в IE (8-й версии в частности), код выполняется ровно один раз, при повторной активации выдает ошибку memory leak и соответственно ничего не делает.

Как я понял, какая-то проблема с удалением переменных, в остальных браузерах она работает корректно, тогда как в IE вызывает какие-то проблемы, из-за чего код срабатывает только раз.



Вопрос — как победить?

Возможно стоит как-то переписать код, чтобы избежать этого delete, но пока сам не знаю как.
  • Вопрос задан
  • 2763 просмотра
Пригласить эксперта
Ответы на вопрос 6
monolithed
@monolithed
Переменные объявленные без спецификатора var становятся свойствами глобального объекта window (в серверной реализации global).
К таким переменным допустимо применение инструкции delete:

property = 1;

top.property;    //1
self.property;   //1
window.property; //1


Т.е. инструкция delete работает только со свойствами объектов.
Например, допустимо удалять свойства встроенных объектов:

Math.abs;        // function abs() { [native code] }
delete Math.abs; // true
Math.abs;        // undefined


Соответственно, переменные объявленные со спецификатором var удалить нельзя:
var variable = 10;
delete variable; // false
variable;        // 10


PS: в консолях типа FF, Chrome, результат работы инструкции delete может быть не корректный.
Ответ написан
Комментировать
А как вы объявляете глобальные переменные?
Судя по справочникам, есть большая разница между объявлениями:
var a = 2;

и
a = 2;

В первом случае созданная переменная будет являться свойством класса window и напрямую такая переменная удалена быть не может (по крайней мере об этом твердят некоторые справочники). Т.е. вполне может быть, что многие современные браузеры игнорируют эту разницу и удаляют в обоих случаях, а более старые IE (еще видел упоминание про FF 1.5) получают проблемы.
Ответ написан
Genome_X
@Genome_X Автор вопроса
Хм, спасибо за подсказку и новодки, попробую действитульео предопределить, а затем не удалять, а менять значения.
Но, тем не менее, если просто объявляется переменная выражением типа someval = 4; (к примеру), её уже не удалить? Для чего же существует тогда delete?
Ответ написан
Genome_X
@Genome_X Автор вопроса
Так, только что проверил, в Хроме последней версии все также корректно работает. Т.е. работает во всех браузерах, кроме IE (на 9-ке не проверял кстати пока).
Как-то странно, что глобальную переменную нельзя удалить. Получается по логике все браузеры работают некорректно и только IE выдает ошибку потому что знает как правильно? Как-то это на сомнения наталкивает.
Ответ написан
gaelpa
@gaelpa
Не считая того, что лучше такие переменные видимо не удалять а переводить в undefined (и не глобальные, а, например, в замыкании), попробуйте создавать их и удалять с полным указанием «пути», т.е. delete window.myvar1.
Ответ написан
Genome_X
@Genome_X Автор вопроса
Ааааааа, ну классс… :(
В общем, работает в IE9-й версии. не работает в IE более младших версиях (8-й и ниже).
Посмотрел под отладчиком, пишет «Object doesn't support this property or method». Ругается на строчку после «if (»perem1" in window && «perem2» in window)", где у меня есть некоторые манипуляции с переменными.
Блин. Засада.

Мысль, кстати, была неплохая, поиграться не удалением, а установлением значения переменной в null.
Работает, в принципе, только пока не могу понять как условие изменить условие («perem1» in window && «perem2» in window) для первого и последующих кликов.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы