Ich komme aus einem Java-Hintergrund, mit seinem klassenbasierten Vererbungsmodell, und versuche, mich mit dem Prototyp-basierten Vererbungsmodell von Javascript vertraut zu machen. Ein Teil dessen, was mich abschreckt, glaube ich ist, dass ich Javas Bedeutung von "diesem" fest im Kopf habe - und Javascript "dieses" ist ein ganz anderes Biest. Ich verstehe, dass Javascript "das" immer auf den Aufrufer der Funktion verweist, nicht auf den Bereich, in dem die Funktion definiert wurde - ich meine, ich habe das gelesen und verstehe oberflächlich, was es bedeutet. Aber ich würde gerne das Verständnis vertiefen, und ich denke, einen anderen Namen dafür zu haben, würde helfen. Wie denkst du über JS "das"? Machst du jedes Mal einen mentalen Ersatz, wenn du darüber stolperst? Wenn ja - welches Wort oder welche Phrase verwenden Sie?Was wäre ein besserer Name für Javascript "this"?
Antwort
this
nach vernünftigem Ermessen context
in Javascript umbenannt werden.
Es ist wirklich Bezug auf einen Ausführungskontext für den aktuellen Bereich, und während dieses Zusammenhangs kann eine Instanz einer Klasse sein, es hat sicherlich nicht — sein, um es überhaupt jedes Objekt sein kann, und es kann zur Laufzeit geändert werden.
Beweis, dass es keine Garantie dafür, dass eine „Methode“ in Javascript, in dem auf einer Instanz der „Klasse“ ist definiert, arbeitet:
function Cat(){
this.texture = 'fluffy';
this.greet = function(){
alert("Pet me, I'm " + this.texture);
}
}
var cat = new Cat();
// Default to using the cat instance as the this pointer
cat.greet(); // Alerts "Pet me, I'm fluffy"
// Manually set the value of the this pointer!
cat.greet.call({texture: 'scaly'}); // Alerts "Pet me, I'm scaly"
dort Es ist wichtig zu beachten, dass der Wert des this
Objekts ist vollständig unabhängig davon, wo die enthaltende Funktion definiert ist.
Also ist es richtig zu sagen, dass das "this" -Schlüsselwort dynamische Scoping in Javascript emulieren kann ?. (Im Allgemeinen haben alle Funktionen einen lexikalischen/statischen Gültigkeitsbereich) – techzen
Ich denke, JavaScript this
ist viel näher an Javas this
als Sie denken. In einem OOP-Kontext bedeutet this
"diese Instanz". Ich denke, was an JavaScript this
Schlüsselwort verwirrend sein kann ist, dass es kann haben unterschiedliche Bedeutung je nach Kontext.
"Das" bedeutet nicht immer "diese Instanz". Beispielsweise können Sie den Wert von "this" für jede Funktion manuell festlegen, indem Sie Function.call oder Function.apply verwenden. – Triptych
Richtig, also "das" bedeutet "diese Instanz", bis Sie es ändern. Das ändert nichts an der ursprünglichen Bedeutung von "dies".Ich kann also davon ausgehen, dass Sie mir zustimmen, dass "das" sehr kontextabhängig ist? –
Sie müssen wirklich darauf vertrauen, dass 'dies' vom Anrufer richtig eingestellt wird. Genau wie in objective-c vertraue ich darauf, dass "Selbst" wirklich die aktuelle Instanz ist. In Java können Sie "this" nicht ändern, um auf etwas anderes zu verweisen. – Kekoa
Wie wäre es mit 'JavaScript this'? Es hält Sie direkt an das, was Sie tun, und auch die mentale Erinnerung daran, dass das Konzept des "Dies", mit dem Sie gerade arbeiten, das JavaScript-Konzept ist.
Schließlich würde ich erwarten, dass Sie aufhören würde, es "JavaScript das" zu nennen und es einfach "das" zu nennen, in vollem Bewusstsein dessen, was das in dem Kontext bedeutet, in dem Sie arbeiten. Was ich erwarten würde ist wahrscheinlich, wo du hinkommen willst.
Ja. Mit Entschuldigung zu Zen: Bevor Sie Javascript gelernt haben, sind Berge Berge; Wasser sind Wasser. Als ich JavaScript lernte, waren Berge nicht mehr Berge und Gewässer, keine Gewässer mehr. Sobald ich Javascript gemeistert hatte, waren Berge wieder Berge und Wasser wässerte wieder. –
this
ist nicht ein Anrufer Funktion (obwohl es sein könnte) oder der Umfang, in dem die Funktion definiert wurde (obwohl es sein könnte) - es ist dieKontext der Funktion.
Die wechselnde Bedeutung, auf die sich @Andrew Hare bezieht, ist wahrscheinlich näher an der Quelle Ihrer Verwirrung; Aufgrund des Prototyp-Vererbungsmechanismus von JS kann das Schlüsselwort function
je nachdem, wie es verwendet wird, etwas näher an Javas class
als die Java-Methodendefinition bedeuten.
Unter der Annahme, Ausführung im Browser:
var q = this.document; //this is window
var o = new (function pseudoconstructor(){
this.property = "something else" //the new keyword changed 'this' to mean 'the object I'm about to return'
})();
Eine mögliche alternative Bezeichnung wäre owner
. Dies würde Ihren Geist in die Richtung führen, die der Besitzer ändern kann, abhängig davon, welchen Code Sie ausführen.
Dieses Beispiel stammt aus quirksmode:
In JavaScript this
bezieht sich immer auf den „Besitzer“ der Funktion sind die Ausführung uns, oder besser gesagt, auf das Objekt, dass eine Funktion ein Verfahren zur Herstellung ist. Wenn wir unsere treue Funktion doSomething() auf einer Seite definieren, ist ihr Eigentümer die Seite bzw. das Fensterobjekt (oder globales Objekt) von JavaScript. Eine onclick-Eigenschaft gehört jedoch dem HTML-Element, zu dem sie gehört.
Im folgenden Code,
function doSomething() {
this.style.color = '#cc0000';
}
und
element.onclick = doSomething;
, owner
Punkte auf das Objekt, das das Verfahren enthält, wenn sie ausgeführt wird.
------------ window --------------------------------------
| /\ |
| | |
| this |
| ---------------- | |
| | HTML element | <-- this ----------------- |
| ---------------- | | doSomething() | |
| | | ----------------- |
| -------------------- |
| | onclick property | |
| -------------------- |
| |
----------------------------------------------------------
Ich habe (noch) nicht downvote, aber ich mag diese Antwort nicht, weil es zu der Annahme führt, dass der Wert des this-Zeigers "immer" ist. bestimmt durch, wo die Funktion definiert ist, was völlig falsch ist. – Triptych
ich absorbieren neue Syntax mit wenig einfach zu Art mentale Modelle wie:
$(document).ready(function() {
function baffle() {
alert(this.b);
}
function what() {
this.b = "Hello";
baffle();
}
function huh() {
this.b = "World";
baffle();
}
what();
huh();
}
);
Dieser schlecht übersetzt in schlampig, imaginären C++ als:
template <class This>
function baffle() {
alert(This.b);
}
function what() {
b = "Hello";
baffle<what>();
}
function huh() {
b = "World";
baffle<huh>();
}
what();
huh();
Ich denke, this
ist aus historischen Gründen am besten geeignet. Es gibt nicht wirklich eine einheitliche Formel für this
in JavaScript, da sie nicht nur automatisch sehr unterschiedlichen Referenzen zugewiesen werden kann, z. B. this
im Kontext einer prozeduralen Funktion oder this
im Kontext eines Objekts , aber this
kann auch vom Scripter mit Function.apply
und Function.call
zugewiesen werden.
Die Bedeutung von this
ist jedoch nur einstellbar, weil JavaScript und das DOM auf sehr seltsame Weise funktionieren. Die primäre Verwendung von Function.apply
besteht beispielsweise darin, den Kontext einer Elementreferenz in Ereignisaufrufen beizubehalten. Sie werden dies in Prototyes Function.bind()
Methode gesehen haben.
this
ist ein Platzhalter für den Kontext, in dem die Funktion ausgeführt wird, und es ist schwierig, genauer zu sein. Die meisten Verwendungen von this
machen es jedoch zu einem semantisch passenden Schlüsselwort. Im Fall von bind()
, obwohl wir Methoden verwenden, um die Bedeutung von this
innerhalb der Funktion beliebig zu ändern, sollte es verwendet werden, um this
passender als ohne wäre. Viele Amateur-JavaScript-Programmierer werden durch das seltsame Verhalten von this
in Event-Handlern abgeworfen, und Function.apply
wird verwendet, um das "falsch" zu korrigieren.
Selfreferentielle Logik (selbst oder das) vermeidet Paradoxe, um an anderen als dem Selbst zu arbeiten (dies). Soll self (this) alles und alles eins halten, kann es auch statisch bleiben, ohne Instanz und mit Klassenmethode (statisch). Um Paradoxien zu vermeiden, vermeide Selbstreferenzen und Logik hält alle Wahrheiten beweisbar und umgekehrt, alle Beweise sind wahr.
Zuerst erschien mir die Frage albern, aber nachdem ich ein paar Antworten gelesen habe, ist es eigentlich ziemlich interessant ;-) +1 –