Diskuze: klíčové slovo this

JavaScript JavaScript klíčové slovo this

Avatar
Honza Bittner
Redaktor
Avatar
Honza Bittner:

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
Ptejte se mě na cokoli na https://github.com/HoBi/ama a followujte mě na Twitteru https://twitter.com/tenhobi. :-)
Avatar
Drahomír Hanák
Tým ITnetwork
Avatar
Odpovídá na Honza Bittner
Drahomír Hanák:

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.