2009-06-16 10 views
10

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"?

+0

Zuerst erschien mir die Frage albern, aber nachdem ich ein paar Antworten gelesen habe, ist es eigentlich ziemlich interessant ;-) +1 –

Antwort

17

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.

+0

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

5

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.

+0

"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

+0

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? –

+1

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

1

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.

+0

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. –

3

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' 
})(); 
9

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 |       | 
|   --------------------       | 
|              | 
---------------------------------------------------------- 
+1

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

0

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(); 
0

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.

-1

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.