Ich neige dazu, in Bezug auf Funktionen zu denken:
Syntax:
C-basiert oder was-hast-du. Java hat eine C-basierte Syntax. Ich empfehle dringend, etwas wie Python oder Ruby auszuprobieren, um sich von der Syntax zu lösen und mehr über die Grundlagen der Funktionsweise einer bestimmten Sprache nachzudenken. Ich bin der Meinung, dass keine Syntax umfangreicher sein muss als C-basiert und keine problematischen Bausteine rund um den Leerraum aufweist.
Kompiliert vs. interpretiert w. Build-Prozess vs. interpretiert / Konsole:
Ich bin mit den Problemen in Bezug auf die Kompilierungszeit und die Laufzeitumgebung nur sehr wenig vertraut, aber ich sehe, dass dort eine ganze Reihe von Problemen auftreten, über die ich selten nachdenke.
Ebenso gibt es viele interpretierte Sprachen, die immer noch einen kompilierten Prozess haben, um in einer virtuellen Maschine wie Java ausgeführt zu werden. Sie müssen immer noch neu erstellen, um Änderungen an den Dingen zu sehen.
Und dann gibt es noch JavaScript und Python, die Sie im laufenden Betrieb Befehl für Befehl in einer Konsole in einer Live-Umgebung ausführen können. Alle drei können zu sehr unterschiedlichen Arten des Codeschreibens führen.
Dynamisches oder striktes Tippen:
Ich neige dazu, die beiden als Designkompromisse zu sehen. Wenn Sie sich auf einem viel niedrigeren Niveau befinden und die Leistung kritisch ist, ist statisches Tippen sehr sinnvoll. Ich habe nie verstanden, dass einer "sicherer" ist als der andere, aber ich bin auf eine sehr plastische / dynamische Sprache gekommen, in der man nur lernt, wie das Schreibsystem funktioniert und was man im Grunde erwartet. Typ-Shenanigans sind für mich in JS selten ein Problem. In gewisser Weise kann die Flexibilität die Dinge robuster machen, obwohl dies zugegebenermaßen für einen Entwickler jüngerer Spielstärken ein bisschen geheimnisvoller ist, wenn Sie nicht über einige der Schlaglöcher in der Sprache Bescheid wissen.
Block Level Scope vs. Function Scope vs.
Die Blockebene ist die häufigste (in den meisten c-basierten Syntaxsprachen zwischen {}). Der JavaScript-Bereich basiert auf Funktionen (die auch dazu verwendet werden, um Objekte so effektiv wie möglich zu erstellen). Es gibt auch große Unterschiede in der Art des Zugriffs, den Sie vom inneren zum äußeren Bereich haben. Ich kenne andere Rahmenregelungen nicht, bin mir aber sicher, dass sie existieren.
Klassisches OOP vs. prototypisches OOP vs. Fast-OOP (Strukturen in C?) Vs. Nicht-OOP:
Sogar in OOP-Klassen gibt es viel Spielraum für Variationen. Ob Sie Mehrfachvererbung durchführen können (ew, weit darüber hinaus, ew), Schnittstellen definieren usw.
In JavaScript gibt es eine Art verkümmertes Hybrid-OOP für Prototypen, bei dem Objekte wesentlich einfacher und in hohem Maße wandelbar sind, aber wir haben immer noch die Möglichkeit, die Schnittstelle von internen Belangen zu trennen, wobei IMO der wichtige Aspekt der Verkapselung ist.
Das Besondere an OOP ist, dass es wirklich eine Menge Dinge gibt, die man erledigen kann, die im Wesentlichen OOP-orientiert sind, ohne technisch OOP zu sein. Es gibt natürlich Puristen, aber letztendlich geht es bei Design Patterns darum, bestimmte Abstraktionen zu erzielen, die in bestimmten Situationen gut funktionieren. Gehen Sie nicht zu schnell davon aus, dass Ideen aus einer OOP-basierten Sprache keinen Nutzen für etwas haben, das prozessorientierter ist. Und ich spreche nicht über JavaScript. Es ist überhaupt nicht durch seine doofe Version eines Prototyp-basierten OOP-Paradigmas eingeschränkt.
Erstklassige Funktionen:
Es fällt mir schwer, diese nicht in einer Sprache zu haben. Sie können Funktionen weitergeben, als wären sie Daten zur Verwendung in anderen Kontexten. Dies erleichtert insbesondere die Implementierung von Ereignishandhabungsschemata, erleichtert jedoch auch die Anpassung der Sprache an die gewünschte Funktionsweise. Es ist mehr als alles, was ich vermute, die Sache, die JavaScript zum ultimativen Erfolg gemacht hat, obwohl es in zwei Wochen entworfen und als Marketing-Schema mit einer Java-ungefähren Syntax versehen wurde.
Verschlüsse:
Ich bin nicht sicher, wo die Debatte für Java ist, aber ich weiß, dass viele Java-Entwickler vor ein oder zwei Jahren nach diesem Feature verlangt haben. Wenn eine Funktion geschlossen wird, kann in einer Nicht-Abschlusssprache nicht auf sie zugegriffen werden, wenn sie in der Lage ist, auf Inhalte von innerhalb dieser Funktion zu verweisen, da sie nicht ordnungsgemäß erfasst wurden. In einem Closure ist der Ausführungskontext so gebunden, dass Sie, wenn Sie in der Lage sind, auf Inhalte in dieser geschlossenen Funktion aus einem anderen Bereich wie in einem zurückgegebenen Objekt oder einer zurückgegebenen Funktion zu verweisen, diese Variablen im Grunde genommen so erhalten, wie sie waren, als die Funktion geschlossen wurde. Es ist, als würde man den Fuß in die Tür der Müllabfuhr klemmen, obwohl ich vermute, dass es sich eher um Kopien dieser Vars handelt, die in lokalen Vars der verweisenden Entität erstellt wurden.
Rigid / Strict / Safe vs. Ihnen das Seil geben, das Sie wollen:
JS-Entwickler und Java-Entwickler verstehen sich in der Regel überhaupt nicht und ich denke, das hat viel mit den beiden Sprachen zu tun, die sich in diesem speziellen Designspektrum nahezu gegenüberstehen. Ich möchte nicht, dass Sie mich vor mir selbst oder vor den anderen Entwicklern in meinem Team schützen. Ich möchte viel mehr in viel weniger Code tun und das alles je nach Situation auf sehr unterschiedliche (aber für eine bestimmte Domain einheitliche) Weise. Es gibt absolut Kompromisse zu beiden und viele Sprachen tendieren dazu, mehr in die Mitte zu fallen.