Autor Zpráva
DarkMeni
Profil
Zdravím, když vytvořím element doporučovanou DOM funkcí (takže ne přes innerHTML ale pomocí document.createElement();, a pak ho budu chtít někde odstranit:
element.removeChild(co_chci_odstranit);
A návratovou hodnotu funkce si nikam neuložim, smaže se on i případné vnořené elementy i z paměti v javascriptu?
Chamurappi
Profil
Reaguji na DarkMeniho:
Pokud se už na ně ve skriptu nepůjde žádným způsobem dostat (tzn. zanikne i obsah proměnných, ve kterých ten element máš), budou moci být smazány. Což neznamená, že se paměť uvolní hned.

když vytvořím element doporučovanou DOM funkcí (takže ne přes innerHTML
Proč přesně nechceš použít innerHTML?
DarkMeni
Profil
Snad je to rychlejší a innerHTML přepisuje (maže) události.

Takže nakonec:
element.removeChild(co_chci_odstranit);
delete co_chci_odstranit;
nebo se removeChild postará i o odstranění odebraného elementu?

Ještě otázka:
Proměnné vytvořené uvnitř funkce se po dokončení funkce smažou? (nedá se k nim pak už dostat)
function a(){
  var b = 1;
  return b;
}
var c = a();
Tady se b sice vytvoří ale po dokončení funkce se na něj už nedá dostat, takže může pak být smazanej nebo ne?
1 bitová proměnná je sice nic moc na tento příklad, ale kdyby tam bylo těch proměnných víc a obsahovaly by elementy, které si myslim tahaj docela dost paměti.
DarkMeni
Profil
Nebo je rychlejší innerHTML? Teď jsem narazil na W3C DOM vs. inneHTML a tam je prej že je innerHTML o dost rychlejší.
Jak často si javascript čistí paměť? (Jako jestli až dorazí k limitu nebo to dělá v nějakých časových intervalech?)
_es
Profil
DarkMeni:
Teď jsem narazil na W3C DOM vs. inneHTML a tam je prej že je innerHTML o dost rychlejší.
Metóda innerHTML sa dá použiť vhodne aj nevhodne. Nevhodné je napríklad pridávať obsah spôsobom element.innerHTML+=pridanýObsah. Oba spôsoby sa dajú aj vhodne kombinovať.

nebo se removeChild postará i o odstranění odebraného elementu?
Treba spraviť, aby premenná co_chci_odstranit neodkazovala na vybraný element, alebo, ak je lokálna, obvykle zanikne po skončení funkcie. Na premenné operátor delete nemá vplyv. Obvykle sa takýmito detailami nemá veľký zmysel zapodievať.

Proměnné vytvořené uvnitř funkce se po dokončení funkce smažou? (nedá se k nim pak už dostat)
Nie vždy, len „ak sa k nim nedá dostať“. Ak napríklad zostanú nejako zachované funkcie do tej funkcie vnorené, tak môžu zostať zachované aj premenné.

Jak často si javascript čistí paměť?
Rôzne prehliadače to robia rôzne.
DarkMeni
Profil
element.innerHTML += 'Obsah'; Je nevhodné kvůli čemu? (Jen aby jsem si v tom udělal jasno)
Nebo takto - jestli to chápu dobře:
Na vnoření elementu do jiného elementu je vhodné použít teda DOM metodu appendChild (když spojení řetězců (+=) u innerHTML je nevhodné)
A na přepsání celého obsahu elementu je teda vhodné i innerHTML?

Co jsem četl jak je to s delete a proměnnou - když for in není stavěný na procházení pole (ale umí to), je teda něco, co na procházení prvků v poli je stavěné (pro každý prvek v poli udělej to a to - něco jako v php foreach)?

Jinak díky.
Radek9
Profil
DarkMeni:
Je nevhodné kvůli čemu?
Třeba proto, že to všechny elementy tvoří znova.

co na procházení prvků v poli je stavěné
Klasický for:
for(var i=0;i<array.length;++i){
  …
}
_es
Profil
DarkMeni:
element.innerHTML += 'Obsah'; Je nevhodné kvůli čemu?
Stručné vysvetlenie. Príklad, aké komplikácie to môže spraviť.
DarkMeni
Profil
_es:
Jo to sou ty přepisovaný události, aha, díky.
Radek9:
Tak pořád je to cyklus for, je to aspoň rychlejší?
Radek9
Profil
DarkMeni:
Tak pořád je to cyklus for
Ano, ale musíš rozlišovat for…in a klasický for. for…in je určený k procházení obecných objektů (tedy vlastně jakýchsi hash-map). Pole procházej tím druhým způsobem, promítnou se ti potom jen indexy, ne i vlastnosti objektu Array.
DarkMeni
Profil
A jo, u Array.prototype.mojeMetoda mi to někdy dělalo problém, díky.

Vaše odpověď

Mohlo by se hodit

Neumíte-li správně určit příčinu chyby, vkládejte odkazy na živé ukázky.
Užíváte-li nějakou cizí knihovnu, ukažte odpovídajícím, kde jste ji vzali.

Užitečné odkazy:

Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: