## Was ist JavaScript?

JavaScript ist eine Programmiersprache mit der Inhalte auf einer Website manipuliert werden können (Read, Create, Update, Delete).

Ihr Haupteinsatszweck befindet sich in Browsern, aber JavaScript und sein "Ökosystem" sind so groß gewachsen, dass es nahezu überall verwendet werden kann.

Zu diesen zusätzlichen Anwndungsfällen zählen:

- Backend Development
- Cross-Platform Desktop Application Development
- Cross Platform App Development
- Game Development
- Command Line Interfaces

JavaScript ist eine Script-Sprache.

Code wird nicht kompiliert sondern wird mit einem Interpreter "geparsed" und dynamisch ausgeführt.

JavaScript hat - obwohl sein Name - NICHTS mit Java zu tun.

JavaScript als Sprache wird von einem Standard beschrieben: ECMAScript.

In Summe sind JavaScript und ECMAScript ein Synonym zueinander und sind entsprechend gleich (falls Ihnen einmal "ECMAScript" vorkommen sollte)

Features von JavaScript

- First-Class Functions
- Prototype-Based
- Multi-Paradigm
- Single-Threaded
- Dynamic

Alles in allem ist JavaScript (JS) eine mächtige Sprache.

Dadurch lassen sich viele Dinge "implementieren", die in anderen Sprachen nur durch Mehraufwand möglich sind.

Problem hierbei ist aber auch, dass unerfahrene Entwickler öfters gravierende Fehler produzieren können, die JS "verschluckt" und dies wiederum zu ungewollten Situation in der Website führt.

Die Sprache selber hat nur ein paar Kernfunktionalitäten. Browser und andere Runtimes ermöglichen den Zugriff auf verschiedene API's.

So bieten Browser eine DOM-API an, um auf das Dokument selbst zuzugreifen, während NodeJS (eine Runtime zum ausführen auf dem Computer) API's zum Zugriff auf das Dateisystem bereitstellen.

### Feature: First-Class Functions

Funktionen sind einfach als Variablen definiert. Man kann sie ggf. überschreiben und an andere Funktionen übergeben.

### Prototype Based

In JavaScript ist alles ein Objekt mit dem man Interagieren kann.

Je nachdem des Typen des Objektes (zum Beispiel "String"), enthält dieser Objekt-Typ Grundlegende Funktionalitäten, die als "Prototypen" definiert sind.

Im Grundlegensten Sinne kann man das als Klassenbasiertes Verhalten Kennzeichnen.

### Mutli-Paradigm Programming

JavaScript ist eine sehr Flexible Sprache. Sie lässt verschiedene Programmier-Arten zu die auch alle untereinander verwendet werden können.

Beispiele sind: Objektorientert (mittels Klassen), Funktional (moderne Frameworks sind meist so aufgebaut), etc.

### Single Threaded

Als Programmierer entwickelt man auf einem einzigen Thread. Hat für uns Entwickler den Vorteil das wir nicht auf Concurrency achten müssen.

Nachteil hierbei ist natürlich: Wenn der Thread einen Deadlock o.ä. hat, können wir uns davon nicht mehr erholen.

Aber JS bietet moderne Lösungen um lang anhaltende Operationen "auszulagern". Mehr dazu später.

### Dynamic

In JS müssen Datentypen nicht explizit deklariert werden. Tatsächlich lassen sich keine Datentypen auf Variablen deklarieren.

Moderne SuperSets wie TypeScript bilden eine Schicht auf JavaScript, um ein komplexes Typensystem zu implementieren. Am Ende wird aber jeglicher Code für Browser verständlich gebaut.