Válí se ti projekty v šuplíku? Dostaň je mezi lidi a získej cool tričko a body na profi IT kurzy v soutěži ITnetwork summer 2017!
Přidej si svou IT školu do profilu a najdi spolužáky zde na síti :)
Avatar
Honza Bittner
Redaktor
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
Student FIT ČVUT. Sleduj mě na https://twitter.com/tenhobi a zeptat na cokoli se mě můžeš na https://github.com/HoBi/...
Avatar
Drahomír Hanák
Tým ITnetwork
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  +1 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.