2016-08-04 13 views
-1

Ich stoße in ein grundlegendes Argument über stark typisierte und statisch typisierte Sprachen. Der andere Debater ist ein reiner Javascript-Enthusiast. Während ich gerne mit C# und Javascript arbeiten. Das Gespräch entstand über die Diskussion über TypeScript und wie es besser ist als pure js, weil es stark typisiert ist. (schon subjektiv). Also lieferte ich ihm ein Argument, dass TypeScript bereits mit dem folgenden Beispiel fehlschlägt.Grundsätzlich kann das Schlüsselwort "this" in C# vs. Javascript gleich sein

class Greeter { 
    greeting: string; 
    constructor(message: string) { 
     this.greeting = message; 
    } 
    greet() { 
     return "Hello, " + this.greeting; 
    } 
} 

var greeter = new Greeter("world"); 
var greetWorld = greeter.greet; 
alert(greetWorld()); //undefined, unexpected for strongly typed languages 

Ich habe bereits gesagt, dass dies in JS erwartet wird. In der Tat, ich liebe das. Aus diesem Grund ist eine dynamisch typisierte Sprache so mächtig. Aber das 'this' Schlüsselwort ist nichts anderes als eine Eigenschaft in JS und warum TypeScript nur eine zusätzliche Ebene ist, die Verwirrung stiftet und es nicht besser macht.

"Wenn eine Funktion erstellt wird, wird ein Schlüsselwort namens this (hinter den Kulissen) erstellt, das mit dem Objekt verknüpft ist, in dem die Funktion ausgeführt wird." (JS).

Nun, das ist wirklich nur eine Eigenschaft der Funktion/Objekt dann. Die Definition von stark typisiert: "Jede Art von Daten (wie Integer, Zeichen, Hexadezimal, gepackte Dezimal usw.) ist als Teil der Programmiersprache vordefiniert und alle Konstanten oder Variablen für ein bestimmtes Programm definiert werden müssen mit einem der Datentypen. " Die Datentyp-Funktion/Objekt ist also ein separates Schlüsselwort "ONE" der Datentypen.

Ich kann einfach nicht scheinen, den Streit nach Hause zu fahren. In der Tat könnte ich sogar falsch liegen. Für mich ist das obige Problem jedoch ein Laufzeittypfehler, dass es keine greeting ist, obwohl es erwartet werden sollte, wenn das Schlüsselwort 'this' wirklich in der Programmiersprache gebunden wäre.

Fehle ich etwas?

+1

Ich weiß nicht, ob Sie Ich vermisse etwas, aber ich fürchte, ich vermisse deinen Standpunkt. Was ist die Frage?Eine Sache kann ich Ihnen jedoch sagen: Wenn jemand beharrlich nicht begreifen kann, was Sie ihm sagen, ist mindestens einer von Ihnen entweder zurückgeblieben oder nicht bereit zuzuhören. Und das bedeutet, dass es Zeit ist, Ihre Verluste zu reduzieren, sich die Hände zu schütteln und ein paar Hausaufgaben zu machen, um sicherzustellen, dass Sie nicht der Zurückgebliebene sind. –

+3

Ich finde es unfair zu sagen, dass TypeScript nicht jedes Verhalten einer stark typisierten Sprache replizieren kann, sondern "nicht besser" als JavaScript. – user1620220

Antwort

0

In C# ist dieses Schlüsselwort innerhalb jeder Klassenmethode verfügbar und bezieht sich auf das aktuelle Objekt, das zum Aufrufen der Methode verwendet wird. Als ich mit dem Schreiben von JavaScript anfing, ging ich davon aus, dass es genauso sein würde, aber ich fand bald heraus, dass ich falsch lag. Dies in JavaScript hat ein anderes Verhalten.

Schauen Sie sich diese Link

1

In JavaScript, das Schlüsselwort this bezieht sich auf den aktuellen Kontext Aufruf, wie auf die aktuelle Instanz Gegensatz in C#.

In den folgenden Zeilen:

var greetWorld = greeter.greet; 
greetWorld(); //returns "Hello, " + Window.greeting 

Sie rufen greetWorld()Window Kontext verwendet wird, so wird this zum Windows Objekt beziehen.

Wenn Sie das C# Verhalten simulieren möchten würden Sie binden haben Objektkontext auf die Funktion Ihres Greeter:

var greetWorld = greeter.greet.bind(greeter); 
greetWorld(); //returns "Hello, " + greeter.greeting 

Alternativ:

var greetWorld = greeter.greet; 
greetWorld.bind(greeter)(); 
+0

Der Punkt ist. Groß. Sie können .bind verwenden. Großartig, es ist undefiniert, wenn nicht. Aber das macht es nicht stark typisiert. Es ist ein unerwartetes Verhalten aufgetreten, das zu einem Laufzeittypfehler geführt hat. Nehme ich verrückte Pillen? Ich verstehe, wie das funktioniert. –

+0

@ChrisClark Es ist nicht unerwartet. So funktioniert die Sprache. Sie können einen Laufzeitfehler erhalten, abhängig davon, ob die Begrüßungseigenschaft im aktuellen Kontext vorhanden ist oder nicht. Wenn Sie 'Window.greeting =" Matt "' hätten, würde Ihr Beispiel "Hallo, Matt" alarmieren. –

+0

Das ist buchstäblich die Definition eines Typfehlers. Sie werden downvoted, weil Sie nur versuchen zu erklären, wie "das" in JS funktioniert. Die Verbindung nicht ansprechen. Zwischen statischen Typen/stark typisierten etc. –