Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
Honza Bittner
Tvůrce
Avatar
Honza Bittner:13.4.2014 17:14

Ahoj, narazil jsem na problém s používáním klíčového slova this.

Pokud používám this v OOP, jQuery atp. tak se mohou "překrývat", tedy někde je this něco jiného než jinde.

Nemáte nějaký nápad, jak používat klasické this v OOP, například dosazením ho do jiné proměnné - tak aby to fungovalo všude v objektu a ve všech jeho prototypech? :)

Odpovědět
13.4.2014 17:14
FIT ČVUT alumnus :-) Sleduj mě na https://twitter.com/tenhobi a ptej se na cokoli na https://github.com/tenhobi/ama.
Avatar
Odpovídá na Honza Bittner
Drahomír Hanák:14.4.2014 15:13

this, nebo kontext funkce, je v JavaScriptu hodně proměnlivý parametr. Každá funkce má nějaký kontext a ten se může měnit v závislosti na objektu, na němž se vykonává. Zavolat funkci s jiným kontextem lze pomocí metod Function.apply, Function.call; změnit kontext funkce umí metoda Function.bind, která v podstatě obalí funkci něčím takovým:

function() {
   return fce.apply(kontext, arguments);
};

Uložit si referenci na objekt do nové proměnné je taky možné. V CoffeeScriptu na to existuje dokonce zkrácený zápis. Např.:

// CoffeeScript
promise.then (data) => @scope.$broadcast 'service:data', data

// se přeloží do JavaScriptu asi takhle:
promise.then((function(_this) {
   return function() {
      _this.scope.$broadcast('service:data', data);
   };
})(this));

EDIT: Abych odpověděl na otázku, v zásadě bys s kontextem funkcí neměl mít problémy, pokud ho nějak často dynamicky neměníš. Jsou případy, kdy je to vhodné nebo dokonce nutné, ale v některých situacích je lepší to nedělat, případně si uložit ten objekt do lokální proměnné a odkazovat na něj přes tuhle proměnnou jako je to v příkladu výše.

Editováno 14.4.2014 15:18
 
Nahoru Odpovědět
14.4.2014 15:13
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 2 zpráv z 2.