Există vreo modalitate de a specifica ce "asta" vreau să folosesc într-o funcție anonimă JS, similară cu modul în care Java o face?

Am întâmpinat această problemă de câteva ori și mă întreb dacă poate fi rezolvată fără a obliga funcția anon la "aceasta" în contextul obiectului părinte.

Iată situația mea:

Am un obiect asemănător cu array, permiteți-i să numească "numline", care implementează o metodă "fiecare". Este conținut într-o altă instanță a unui obiect, permiteți-i să se numească "numtank". Codul actual arată cam așa:

function Numtank(numline) {
    this.numline = numline;
};
Numtank.prototype.charForElem(elem) {
    return "Number: " + elem;
}
Numtank.prototype.toString() {
    var str = "";
    this.numline.each(function(elem) {
        str += this.charForElem(elem); //But 'this' is called in the contex of the 'numline' instance, which dosen't (and shouldn't) have the charForElem class. 
    });

    return str;
}

var tank = new Numtank(arbatraryNumline);
tank.toString(); //Uncaught ReferenceError: charFromElem is not defined in numline

Când vă întreb "similar cu modul în care Java o face", vreau să spun modul în care Java vă permite să prefixați numele clasei la "acest" pentru a specifica ce "aceasta" să folosească.

Există oricum o idee despre asta fără a fi obligat să asociem funcția anonomouns?

0
Acest lucru este util când este disponibil. Când nu este, este atât de verbală. Vroiam să fac o trimitere la call / apply , dar am crezut că nu răspunde la întrebarea ta.
adăugat autor Alexander, sursa
@Esailija: Are sens, nu știam că a fost metoda standard pentru a pune în aplicare o metodă forEach.
adăugat autor dymk, sursa
@Esailija: Nu este o matrice JS reală, ci o clasă care oferă o serie de funcții interne de matrice.
adăugat autor dymk, sursa
Ar trebui să utilizați semnătura standard .forEach , care ia contextul apelului ca al doilea argument
adăugat autor Esailija, sursa
adăugat autor Esailija, sursa
Poate fi folosit și pe orice non-matrice: []. ForEach.call (document.body.childNodes, function() {}, aceasta) : P
adăugat autor Esailija, sursa

2 răspunsuri

Ceea ce se face în general este să ții o referință numită self . Este cea mai obișnuită practică.

Numtank.prototype.toString() {
  var self = this, str = "";
  this.numline.each(function(elem) {
    str += self.charForElem(elem);
  });
  return str;
}
0
adăugat
Mulțumesc, speram că va exista o modalitate de a specifica ce "să folosească", dar dacă este o practică comună, o să fac asta.
adăugat autor dymk, sursa

Puteți salva o copie a acest într-o altă variabilă.

var oldThis = this;

Variabila va fi vizibilă pentru acele funcții inversate de apel invers.

0
adăugat
JavaScript, România - Moldova
JavaScript, România - Moldova
328 participanți

Comunitatea Română JavaScript: github.com/js-ro Pentru confort, opriți notificările. Parteneri: @node_ro, @php_ro, @python_ro, @seo_ro, @RomaniaGroup, @ai_ro, @Grupuri_IT Offtop: @holywars_ro Joburi: @js_jobs_ro Sponsored with ❤️ by ciupacabra.com