Podczas korzystania z var that = this dla wywołania zwrotnego, dlaczego funkcja zwrotna musi być function() {that.myFn()} zamiast that.myFn?

Na przykład:

var obj = {

  foo: function(fn) {
    console.log('--foo--', this);
    fn();
  },

  bar: function() {
    console.log('--bar--', this);
  },

  render: function() {
    var that = this;

    // this line works
    this.foo( function() {that.bar()} );

    // this line doesn't work
    this.foo(that.bar);
  }

}

obj.render()
0
jim 25 czerwiec 2017, 09:57

3 odpowiedzi

Najlepsza odpowiedź

Kiedy wywołujesz funkcję na nieruchomości

myObject.myFunction();

Automatycznie wiąże wartość this do tego obiektu, podczas gdy po prostu uzyskanie odniesienia do tego obiektu funkcji, tak jak:

var x = myObject.myFunction;
x();

Nie oznacza żadnego "tego". Pierwsze oświadczenie po prostu ustawia X do tej samej funkcji, o której znajduje się ta właściwość MyObject.

Owijanie go w funkcji:

var x = function(){ myObject.myFunction()};
x();

Czy powołuje się do MyObject jako związany z "to".

Możesz także użyć funkcji JavaScript.Prototype Funkcje "Call", "Zastosuj", i "Bind", jak więc:

var x = myObject.myFunction.bind(myObject, parameterOneIfAny);
x();

Który zwraca funkcję z wyraźnie związanym "to" wartość "myObject". Jego częścią systemu funkcji JavaScript, który obiekty funkcyjne nie zapisują "tego" kontekstu (lub raczej domyślne this do obiektu "Global" w przypadkach, w których nie ustawiasz this ), chyba że zostanie wywołany z składni nieruchomości object.function() lub jawnie związany z object.function.bind(object)

Wreszcie, jeśli zadzwonisz do dowolnego odniesienia do funkcji z new jak w

var x = myObject.myFunction.bind(myObject, parameterOneIfAny);
var y = new x();

this jest instancji jako świeży obiekt i przekazywany jako wartość powrotowa, która jest podstawą fałszywej składni "klasy" JavaScript. Tak więc w tym przypadku X jest wywoływany jako konstruktor, a wartość this jest zwracana, dzięki czemu jesteś "nowym" x.

Wreszcie, tryb ścisłego JavaScript wywołuje Cię, jeśli spróbujesz użyć this w funkcji, która nie została wywołana z kontekstem this, a nie niezbyt ścisłym zachowaniem domyślnego this do obiektu window.

2
slackOverflow 25 czerwiec 2017, 14:11

Jak mówi @slaCoverflow. Tutaj link pomoże zrozumieć HTTPS: //developer.mozilla. Org / DE / Dokumenty / Web / JavaScript / Referencje / Operatorzy / To

Lub spróbuj tego. To ładny post, który może też pomóc. Http: // Ryanmorr. COM / Zrozumienie-Scope-and-Context-in-Javas Cript

-1
Planetary Dev 25 czerwiec 2017, 07:38

Powód, dla którego jest dlatego, że that.bar() jest tym samym, co bar.call(that), ale {x2}} jest taka sama jak fn.call(undefined) i w trybie luźny, undefined staje się kontekstem globalnym, który jest window.

2
Patrick Roberts 25 czerwiec 2017, 07:01