In einer JavaScript-Datei habe ich gesehen:
function Somefunction(){
var that = this;
...
}
Was ist der Zweck that
, this
dies zu deklarieren und zuzuweisen ?
javascript
this
Chris
quelle
quelle
Antworten:
Ich werde diese Antwort mit einer Illustration beginnen:
Meine Antwort hat dies ursprünglich mit jQuery gezeigt, was sich nur geringfügig unterscheidet:
Da sich
this
häufig Änderungen ergeben, wenn Sie den Bereich durch Aufrufen einer neuen Funktion ändern, können Sie mit dieser Funktion nicht auf den ursprünglichen Wert zugreifen. Durch Aliasing aufthat
können Sie weiterhin auf den ursprünglichen Wert von zugreifenthis
.Persönlich mag ich die Verwendung
that
als Alias nicht. Es ist selten offensichtlich, worauf es sich bezieht, insbesondere wenn die Funktionen länger als ein paar Zeilen sind. Ich verwende immer einen aussagekräftigeren Alias. In meinen obigen Beispielen würde ich wahrscheinlich verwendenclickedEl
.quelle
var self = this;
. Das Wortthat
scheint zu implizieren, dass die Variable alles ist, ABERthis
.forEach
Funktion benötigt ein zweites optionales Argument, nämlich die Bindung der Funktion.colours.forEach(function(){/* 'this' is bound correctly --> */}, this);
Daher sollte eine Notiz hinzugefügt werden, dievar that = this
mit nicht wirklich benötigt wirdforEach
.Von Crockford
JS Fiddle
Dies warnt ...
quelle
that
Variable in seinem Beispiel überhaupt nicht verwendet wird. Es sieht so aus, als würde das Erstellen einer Variablenthis
den Rest des Codes beeinflussen.Dies ist ein Hack, um innere Funktionen (Funktionen, die in anderen Funktionen definiert sind) besser funktionieren zu lassen, als sie sollten. Wenn Sie in Javascript eine Funktion in einer anderen definieren, wird diese
this
automatisch auf den globalen Bereich gesetzt. Dies kann verwirrend sein, da Siethis
denselben Wert wie in der äußeren Funktion erwarten .Dies ist insbesondere dann ein Problem, wenn Sie eine Funktion als Methode eines Objekts
car.start
erstellen (wie im Beispiel) und dann eine Funktion innerhalb dieser Methode erstellen (wie im BeispielactivateStarter
). In der obersten Ebene zeigt die Methodethis
auf das Objekt, es ist eine Methode von (in diesem Fallcar
), aber in der inneren Funktion zeigt siethis
jetzt auf den globalen Bereich. Das ist ein Schmerz.Das Erstellen einer Variablen, die gemäß Konvention in beiden Bereichen verwendet werden soll, ist eine Lösung für dieses sehr allgemeine Problem mit Javascript (obwohl es auch in jquery-Funktionen nützlich ist). Aus diesem Grund wird der sehr allgemein klingende Name
that
verwendet. Es ist eine leicht erkennbare Konvention zur Überwindung eines Sprachmangels.Wie El Ronnoco andeutet, hält Douglas Crockford dies für eine gute Idee.
quelle
Die Verwendung von
that
ist nicht wirklich erforderlich, wenn Sie eine Problemumgehung mit der Verwendung voncall()
oder durchführenapply()
:quelle
Manchmal
this
kann auf einen anderen Bereich und auf etwas anderes verwiesen werden. Nehmen wir beispielsweise an, Sie möchten in diesem Fall eine Konstruktormethode innerhalb eines DOM-Ereignisses aufrufenthis
bezieht sich dies auf das DOM-Element und nicht auf das erstellte Objekt.HTML
JS
Demo
Die obige Lösung geht davon aus
this
, dassthat
wir dann auf die name-Eigenschaft innerhalb dersayHi
Methode von zugreifen könnenthat
, sodass diese ohne Probleme innerhalb des DOM-Aufrufs aufgerufen werden kann.Eine andere Lösung besteht darin, ein leeres
that
Objekt zuzuweisen , ihm Eigenschaften und Methoden hinzuzufügen und es dann zurückzugeben. Aber mit dieser Lösung haben Sieprototype
den Konstruktor verloren.quelle
Hier ist ein Beispiel `
Sie können also sehen, dass dieser Wert zwei verschiedene Werte ist, abhängig von dem DOM-Element, auf das Sie abzielen. Wenn Sie jedoch "das" zum obigen Code hinzufügen, ändern Sie den Wert von "this", auf das Sie abzielen.
..... $ (that) .css ("Hintergrundfarbe", "# ffe700"); // Hier ist der Wert von "that" ".our-work-group> p> a", weil der Wert von var that = this; Obwohl wir uns bei "this" = ".our-work-single-page" befinden, können wir "that" dennoch verwenden, um das vorherige DOM-Element zu manipulieren.
quelle