Změna kódu funkce za běhu

Pro začátek si v prvním příspěvku ukážeme něco jednoduchého.

Třeba jak změnit kód funkce:

fail = function() { return false; }
fail = eval('('
      + fail.toString().replace('false', 'true')
      + ')');
fail();

Co tenhle kód vlastně dělá? V prvním řádku vytvoří velice jednoduchou funkci (čistě pro ukázku), která vždy vrátí false.

Druhý řádek je ten zajímavý. Zde totiž probíhá celá magie (a v tomhle případě to opravdu magie je).

Nejprve tedy metodou toString() získáme zdrojový kód funkce. V něm následně (pro ukázku) necháme změnit text „false“ na „true“ a nakonec pomocí funkce eval znovu ze změněného kódu získáme funkci.

Zdrojový kód funkce je obalen závorkami, protože jinak by mohl kompilátor hlásit, že není možné vytvořit funkci beze jména (např. pokud původní funkce byla vytvořena přiřazením do proměnné nebo jako metoda objektu a tudíž nemá ve vlastním kódu jméno uvedeno). Ozávorkováním z definice funkce vytvoříme příkaz, proti kterému již nic namítat nemůže.

Poslední příkaz pak jen zavolá funkci, která nyní, díky změně kódu, bude vždy vracet true.

Tento postup má ale i svá úskalí (tedy kromě toho, že se to na nic praktického nedá použít):

  1. Není možné tento postup použít na nativní funkce (např. Math.max(); ), protože vlastně žádný kód napsaný v javascriptu nemají a jejich metoda toString() vrací pouze „[native code]„.
  2. Není možné použít na funkce, které byly vytvořeny pomocí uzávěry (Closure), protože nová funkce již nebude mít přístup k původním proměnným.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *

Tato stránka používá Akismet k omezení spamu. Podívejte se, jak vaše data z komentářů zpracováváme..