Javascript

Javascript
Logo.
Anschauliches Bild des JavaScript-Artikels
Datum der ersten Version Mai 1996
Paradigma Multiparadigmen  : Skript , Objektorientiert ( Prototyporientiert ), Imperativ , Funktional
Autor Brendan Eich
Entwickler Netscape Communications Corporation , Mozilla Foundation
Letzte Version 11 - ES2020 (Juni 2020)
Tippen dynamisch , schwach
Normen ECMA-262
ISO / IEC 16262
Dialekte JavaScript, JScript , ECMAScript
Beeinflusst von Selbst , Schema , Perl , C , C ++ , Java , Python
Beeinflusst JScript , JScript .NET , Objective-J , TIScript
Implementierungen SpiderMonkey , Rhino , KJS , JavaScriptCore , V8
Webseite Mozilla
Dateierweiterung js

JavaScript ist eine Programmiersprache von Skripten, die hauptsächlich in interaktiven Webseiten verwendet wird und als solche ein wesentlicher Bestandteil von Webanwendungen ist . Zusammen mit HTML und CSS - Technologien , ist JavaScript manchmal eine der als Kerntechnologien des World Wide Web . Eine große Mehrheit der Websites verwendet es, und die Mehrheit der Webbrowser verfügt über eine dedizierte JavaScript-Engine , um es zu interpretieren , unabhängig von Sicherheitsüberlegungen, die gegebenenfalls auftreten können.

Es ist eine objekt- to- Prototyp orientierten Sprache  : die Basen der Sprache und die Hauptschnittstellen werden bereitgestellt durch Objekte .

Im Gegensatz zu einer objektorientierten Sprache sind Basisobjekte jedoch keine Instanzen von Klassen .

Jedes Basisobjekt (zB das Dokument- oder Windows-Objekt) hat sein eigenes Modell, das es ihm ermöglicht, unter Verwendung von Konstruktoren unter Verwendung seiner Eigenschaften untergeordnete Objekte zu instanziieren . Die Prototyping-Eigenschaft ermöglicht es ihnen beispielsweise, benutzerdefinierte Erbenobjekte zu erstellen .

Darüber hinaus Funktionen sind erstklassige Objekte . Sprache unterstützt das Objekt , zwingend notwendig und funktionales Paradigma . JavaScript ist dank seines npm- Abhängigkeitsmanagers mit rund 500.000 Paketen die Sprache mit dem größten ÖkosystemAugust 2017.

JavaScript wurde 1995 von Brendan Eich erstellt . Es wurde unter dem Namen ECMAScript in . standardisiertJuni 1997von Ecma International im ECMA-262-Standard. Die aktuelle Version dieser Norm ist seit Juni 2020 die 11. Ausgabe.

JavaScript ist eine Implementierung von ECMAScript, die von der Mozilla Foundation implementiert wird . Die Microsoft- Implementierung von ECMAScript (im Internet Explorer bis Version 9) wird als JScript bezeichnet , während die Implementierung von Adobe Systems als ActionScript bezeichnet wird .

JavaScript wird auch für Server verwendet, die (zum Beispiel) Node.js oder Deno verwenden .

Geschichte

Start

Die Sprache wurde im Mai 1995 in zehn Tagen im Auftrag der Netscape Communications Corporation von Brendan Eich erstellt , der sich von vielen Sprachen inspirieren ließ, insbesondere von Java, aber die Syntax für Anfänger vereinfachte . Brendan Eich hat zunächst eine serverseitige Skriptsprache namens LiveScript entwickelt, um das kommerzielle Angebot HTTP-Server für Mosaic Communications Corporation zu stärken . Die Veröffentlichung von LiveScript erfolgte zu einer Zeit, als die NCSA die Mosaic Communications Corporation zwang, ihren Namen in Netscape Communications Corporation zu ändern.Netscape arbeitete damals an der Entwicklung einer Client-orientierten Version von LiveScript. Einige Tage vor der Veröffentlichung ändert Netscape den Namen von LiveScript in JavaScript. Sun Microsystems und Netscape waren Partner und die immer beliebter werdende Java Virtual Machine . Diese Namensänderung diente den Interessen beider Unternehmen.

Im Dezember 1995, Sun und Netscape geben die Veröffentlichung von JavaScript bekannt. ImMärz 1996Netscape implementiert der JavaScript - Engine in seiner Netscape Navigator 2.0 Web - Browser . Der Erfolg dieses Browsers trägt zur schnellen Verbreitung von JavaScript in der kundenorientierten Webentwicklung bei. Microsoft reagiert daraufhin mit der Entwicklung von JScript , das es dann in den Internet Explorer 3.0 einbindetAugust 1996 zum Beenden seines Browsers.

JavaScript wird in einer gemeinsamen Pressemitteilung von Netscape und Sun Microsystems vom als Ergänzung zu Java beschrieben4. Dezember 1995. Diese Initiative hat dazu beigetragen, in der Öffentlichkeit Verwirrung zwischen den beiden Sprachen zu stiften, die syntaktisch ähnlich sind, aber in ihren Grundbegriffen überhaupt nicht, und die bis heute anhält.

"JavaScript" wird von Oracle in den USA zu einer eingetragenen Marke inMai 1997.

Standardisierung

Netscape schickt dann JavaScript zur Standardisierung an Ecma International .

Version 1: Geburt des ECMA-262-Standards

Die Arbeit beginnt in November 1996 und enden in Juni 1997, Der Geburt bis zum Giving 1 st  Ausgabe des ECMA-262 - Standard, der angibt , die Sprache ECMAScript . Die Norm wird dann bei ISO / IEC eingereicht und veröffentlicht inApril 1998 als internationaler Standard ISO / IEC 16262.

Variante 2: Homogenisierung mit dem ISO / IEC 16262 Standard

Redaktionelle Änderungen werden den ECMA-262 - Standard hergestellt nach der internationalen Norm ISO / IEC 16262, die sie in dem entsprechen 2 nd  Ausgabe des ECMA-262 - Standard inJuni 1998.

Version 3: Verbesserungen und Konstitution der Sprache

Die 3 - te  Ausgabe des ECMA-262 - Standard eingeführt:

  • leistungsfähigere reguläre Ausdrücke,
  • verbesserte Handhabung von Zeichenketten,
  • neue Steueranweisungen,
  • Ausnahmebehandlung mit try/catch-Anweisungen
  • Zahlen formatieren.

Es wird von Ecma International veröffentlicht in Dezember 1999 dann bei ISO / IEC eingereicht, die den internationalen Standard ISO / IEC 16262: 2002 in . veröffentlicht Juni 2002. Nach der Veröffentlichung der 3 rd  Edition folgt massive Annahme von allen Web - Browsern.

Version 4: Die unvollendete Etappe

Eine konsequente Arbeit wird die Entwicklung unternommen 4 th  Ausgabe der Norm ECMA-262, aber es wird nicht in diesem Jahr abgeschlossen werden und wird nie den Tag sehen. Teil der Entwicklung jedoch durchgeführt werden in die eingearbeitet werden 6 th  Edition.

Version 5: Begriffsklärung und neue Funktionen

Die 5 th  Edition der ECMA-262 - Standard stellt klar die Zweideutigkeiten der 3 - ten  Ausgabe und führt Getter, Selbstbeobachtung, Kontrolle Attribute, zusätzliche Tabellen Manipulationsfunktionen, das Format unterstützen JSON und Strict - Modus für die Fehlerprüfung. Es wird von Ecma International veröffentlicht inDezember 2009 dann bei ISO / IEC eingereicht, die kleinere Korrekturen vornimmt und die internationale Norm ISO / IEC 16262: 2011 in . veröffentlicht Juni 2011. Am selben Tag wurde die Ausgabe 5.1 der Norm ECMA-262, identisch mit dem Text der internationalen Norm ISO / IEC 16262:2011, veröffentlicht.

Version 6: Verbesserte Unterstützung und Funktionalität

Obwohl die Entwicklung der 6 - ten  Ausgabe der Norm ECMA-262 offiziell im Jahr 2009, kurz vor der Veröffentlichung der gestartet 5 th  Edition, wurde veröffentlicht inJuni 2015die Veröffentlichung der seit ist eigentlich der Höhepunkt von 15 Jahren Arbeit 3 rd  Edition 1999 Das Ziel dieser 6 th  Edition ist ein bessere Unterstützung für großflächige Anwendungen zur Verfügung zu stellen, die Erstellung von Bibliotheken und die Verwendung von ECMAScript als Kompilation Ziel für andere Sprachen. Diese Ausgabe stellt insbesondere Module, Klassen, lexikalischen Geltungsbereich auf Blockebene, Iteratoren und Generatoren vor, verspricht asynchrone Programmierung, Destrukturierungsmuster, Optimierung von Terminalaufrufen, neue Datenstrukturen (Arrays assoziativ, Mengen, binäre Arrays), Unterstützung für zusätzliche Unicode-Zeichen in Strings und regulären Ausdrücken sowie die Möglichkeit, vordefinierte Datenstrukturen zu erweitern.

Von Version 7 bis heute: permanente Anpassung an Webtools

Die 7 - te  Ausgabe der Norm ECMA-262 Edition ist die erste Ausgabe des neuen offenen Entwicklungsprozesses und die jährliche Veröffentlichung vom Ecma TC39 Ausschuss angenommenen Tempo. Ein Textdokument wird aus der erstellten 6 - ten  Auflage und wird über die Entsendung von GitHub als Entwicklungsbasis für diese neue Ausgabe. Nach der Korrektur von Tausenden von Bugs und redaktionelle Fehler sowie die Einführung des Exponential - Operator und ein neues Verfahren zur Prototypen - Boards, die 7 th  ist Auflage erschienen inJuni 2016.

Die aktuelle Ausgabe des ECMA-262-Standards ist die 11. Ausgabe, die im Juni 2020 veröffentlicht wurde.

Sicherheit

JavaScript und die DOM- Struktur von HTML / XML- Seiten weisen einige Sicherheitslücken auf. Dies liegt daran, dass sich bösartige Skripte im Code einer Webseite verstecken und auf dem Zielcomputer des Webbenutzers ausgeführt werden können.

Anbieter von Webbrowsern versuchen, dieses Risiko mit zwei Einschränkungen zu reduzieren:

  • Eine besteht darin, diese Skripte in einem von den anderen Daten getrennten Raum ( Sandbox ) auszuführen, in dem nur webbezogene Aktionen (Mausbewegungen, Pixeldarstellung, Kommunikation) ausgeführt werden können, ohne Zugriff auf das Dateisystem zu haben.
  • Die zweite  Möglichkeit besteht darin, Skripte nur innerhalb der Beschränkungen der Same-Origin-Richtlinie auszuführen: Vor diesem Hintergrund sollte eine Website keinen Zugriff auf Informationen wie Benutzernamen und Passwörter oder Cookies haben, die von anderen besuchten Websites stammen.

JavaScript-Schwachstellen sind oft Verstöße gegen mindestens eines dieser beiden Prinzipien.

Bestimmte Teilmengen der JavaScript-Sprache wie JavaScript — ADsafe oder Secure ECMAScript (SES) bieten ein höheres Maß an Sicherheit, insbesondere für von Dritten erstellte Skripte (einschließlich Werbung). Caja ist eine weitere Software zum sicheren Einbetten und Isolieren von JavaScript und HTML von Drittanbietern.

Die Inhaltssicherheitsrichtlinie ist die primäre Methode, um sicherzustellen, dass auf einer Webseite nur vertrauenswürdige Skripte ausgeführt werden. Meltdown ist eine JavaScript-unabhängige Schwachstelle, die insbesondere in JavaScript ausgenutzt werden kann.

Programmierkonzepte

Der Zweck von JavaScript ist die einfache Manipulation von Objekten im Sinne eines Computers, die von einer Hostanwendung bereitgestellt werden. In einem Webbrowser kann beispielsweise ein in Javascript geschriebenes Skript verwendet werden, um einer Anwendung (Seite oder Website), die ansonsten eine eingefrorene statische Seite wäre, eine interaktive oder dynamische Note hinzuzufügen. Die Javascript-Sprache ermöglicht es beispielsweise, Skripte zu schreiben, um einen Absatz, ein Bild oder ein Popup entsprechend den Interaktionen des Benutzers anzuzeigen oder auszublenden oder den Server über die Lesezeit einer Seite zu informieren.

Bonjour Monde

In einem Skript in Javascript ist es möglich, den Text hallo world auf der Debug-Konsole der Anwendung anzuzeigen . Dies kann von Entwicklern in der Entwicklungsphase verwendet werden. :

window.console.log('Hello world'); window.console.exp(hello world) // ou global.console.log('Hello world'); window.console.log(hello world)

In einer Browser-Hostanwendung ist die Konsole eine der Methoden des globalen Fensterobjekts . In anderen Hostanwendungen wie Node.js ist das globale Objekt global . Da die Methoden des globalen Objekts ohne Präfix zugänglich sind, sind window und global optional.

Die Syntax

console.log('Hello world');

wird daher nicht nur auf allen Umgebungen kompatibel sein, sondern auch genau das gleiche Ergebnis haben.

benutzen

JavaScript-Code benötigt ein globales Objekt , um Deklarationen ( Variablen und Funktionen) daran anzuhängen , bevor Anweisungen ausgeführt werden. Die bekannteste Situation ist die des Fensterobjekts , das im Kontext einer Webseite erhalten wird. Andere Umgebungen sind möglich, einschließlich der von Adobe bereitgestellten oder der Node.js- Umgebung (siehe Weitere Verwendungen unten).

Auf einer Webseite

JavaScript-Code kann direkt in Webseiten integriert und auf der Client- Workstation ausgeführt werden . Der Webbrowser übernimmt dann die Ausführung dieser Programme, die als Skripte bezeichnet werden.

Im Allgemeinen wird JavaScript verwendet, um die in HTML- Formulare eingegebenen Daten zu steuern oder mit dem HTML-Dokument über die vom Browser bereitgestellte Document Object Model- Schnittstelle zu interagieren (dies wird manchmal als dynamisches HTML oder DHTML bezeichnet). Es wird auch verwendet, um dynamische Anwendungen, Übergänge, Animationen zu erstellen oder reaktive Daten zu ergonomischen oder kosmetischen Zwecken zu manipulieren.

JavaScript ist nicht auf die Manipulation von HTML-Dokumenten beschränkt, sondern kann auch zur Manipulation von SVG , XUL und anderen XML-Dialekten verwendet werden .

Unvereinbarkeit

Netscape und Microsoft (mit JScript im Internet Explorer bis Version 9) haben eine eigene Variante dieser Sprache entwickelt, die jeweils den ECMAScript-Standard fast vollständig unterstützt, aber zusätzliche und inkompatible Funktionen aufweist, die im Kontext der Seitenprogrammierung selten verwendet werden. JavaScript-Skripte sind jedoch häufig die Quelle von Schwierigkeiten. Sie sind oft aufgrund der Unterstützung für verschiedene Versionen von Objektmodellen ( DOM ) von Browsern zur Verfügung gestellt, als zur Sprache Portabilität Problemen (die verschiedenen Implementierungen des ECMAScript - Standard zu respektieren relativ gut).

Um dynamisch zu prüfen, ob ein Objekt (in der bei der Interpretation verwendeten JavaScript-Version) tatsächlich eine Methode besitzt, verwenden wir oft eine Konstruktion wie:

if (monObjet.methode && typeof monObjet.methode === 'function') { monObjet.methode(); }

Wir überprüfen also, ob myObjet tatsächlich eine Implementierung einer Methode hat , die wir dann verwenden können. Wenn ein Browser die Methode von myObject nicht unterstützt , unterstützt er meistens eine vergleichbare Methode method2 , und wir können dann den JavaScript-Code an den Browser anpassen, der ihn ausführt:

if (typeof monObjet.methode === 'function') { monObjet.methode(); } else if (typeof monObjet.methode2 === 'function') { monObjet.methode2(); }

Eine andere Methode besteht darin, serverseitig den vom Client verwendeten Browser zu überprüfen und den entsprechenden Code zu senden. Dies ist jedoch nicht ratsam, da es viel besser ist, die Existenz, das Verhalten einer Funktion, Eigenschaft usw. direkt zu testen  . anstatt Annahmen auf der Grundlage der Browsererkennung zu treffen.

Ajax

Ajax (von Englisch Asynchronous JavaScript And XML ) ist eine Reihe von Techniken, die den Datenaustausch zwischen dem Browser und dem Webserver von der Anzeige einer Webseite entkoppeln und es ermöglichen, den Inhalt von Webseiten zu ändern, ohne sie neu laden zu müssen. Dank des JavaScript-Objekts XMLHTTPRequest ermöglicht diese Methode, HTTP-Anfragen vom Webbrowser an den Webserver zu stellen und auch HTTP- Antworten vom Webserver zu verarbeiten, um den Inhalt der Webseite zu ändern. Die Antwort lautete im Allgemeinen im XML- Format, das jetzt tendenziell durch das JSON- Format ersetzt wird, das den Vorteil hat, nativ in JavaScript zu sein. Das Skript manipuliert den Satz von DOM- Objekten , die den Inhalt der Webseite darstellen. Die Technologien XMLHTTPRequest , XML und DOM wurden zwischen 1995 und 2005 zu den Webbrowsern hinzugefügt. Die Ajax-Methode ermöglicht die Erstellung von Rich-Internet-Anwendungen , die mehr Verwaltbarkeit und Komfort bieten; es ist eines der zentralen Themen der Web 2.0- Bewegung .

JSON

JSON ( JavaScript Object Notation ) ist ein Format, das die Notation von JavaScript-Objekten verwendet, um strukturierte Informationen kompakter und näher an Programmiersprachen als XML zu übertragen.

Trotz der Existenz des DOM und der kürzlich erfolgten Einführung von E4X (siehe unten) in die JavaScript-Sprachspezifikation bleibt JSON der einfachste Weg, um auf Daten zuzugreifen, da jeder JSON-Stream nichts anderes als ein serialisiertes JavaScript-Objekt ist. Darüber hinaus bleibt JSON trotz seiner historischen (und technischen) Verknüpfung mit JavaScript ein strukturiertes Datenformat und kann von allen Programmiersprachen problemlos verwendet werden.

Seit 2009 integrieren Browser eine native Unterstützung für das JSON-Format, was dessen Handhabung, Sicherheit (gegen die Auswertung von bösartigen Skripten, die in einem JSON-String enthalten sind) und Verarbeitungsgeschwindigkeit erleichtert. So integrieren ihn Firefox- und IE- Browser jeweils ab den Versionen 3.5 und 8.

JSON-Beispiel:

{ "clef1": "valeur", "clef2": 12345, "clef3": true, "clef4": { "clef5": "valeur" } }

Die Struktur ist nach Schlüssel/Werten organisiert. Schlüssel müssen in doppelten Anführungszeichen stehen. Werte können sein:

  • ein String (Zeichenkette zwischen doppelten Anführungszeichen)
  • eine Zahl
  • ein boolescher Wert (wahr oder falsch für wahr oder falsch)
  • eine Schlüssel-/Wertestruktur

Eine gültige JSON kann keine Kommentare enthalten. Es gibt JSON-Validatoren online.

Andere Verwendungen

Auf einem Webserver

JavaScript kann auch als Programmiersprache auf einem HTTP-Server wie Sprachen wie PHP , ASP usw. verwendet werden. Außerdem arbeitet das CommonJS- Projekt daran, ein Ökosystem für JavaScript außerhalb des Browsers zu spezifizieren (zum Beispiel auf dem Server oder für native Desktop-Anwendungen). Das Projekt wurde von Kevin Dangoor in gestartetJanuar 2009. Das CommonJS-Projekt ist nicht mit der Ecma International TC39-Gruppe verbunden, die an ECMAScript arbeitet, aber einige TC39-Mitglieder nehmen an dem Projekt teil.

Historisch wurde JavaScript auf den Servern von Netscape vorgeschlagen, die später von Sun Microsystems unter den Namen iPlanet und Sun ONE vertrieben wurden , aber JScript kann auf Servern Internet Information Services von Microsoft verwendet werden . JScript kann auch verwendet werden, um eine Microsoft Windows-Plattform über Windows Scripting Host (WSH) zu skripten.

Es gibt auch unabhängige und Open Source Server-Implementierungsprojekte in JavaScript. Unter ihnen können wir Node.js unterscheiden , eine vielseitige Plattform für die Entwicklung von Netzwerkanwendungen, die auf der JavaScript-V8-Engine und den CommonJS- Spezifikationen basiert .

Andere Medien

ActionScript , das in Adobe Flash verwendet wird , ist ebenfalls eine Implementierung von ECMAScript. Es ermöglicht Ihnen, alle Elemente der Animation, die als Objekte betrachtet werden, zu handhaben. JavaScript kann verwendet werden, um andere Adobe- Anwendungen ( Photoshop , Illustrator usw.) zu skripten , was plattformunabhängige Skripte ermöglicht (Microsoft Windows, Apple OSX, Linux usw.).

JavaScript wird schließlich in der Mozilla- Entwicklungsplattform , auf der mehrere Softwareprogramme wie Webbrowser basieren , für Aufgaben rund um die Benutzeroberfläche und interne Kommunikation verwendet (z.B.: Die Erweiterungen von Firefox und Thunderbird werden auf Basis von XPI- Dateien mit JavaScript installiert installed Siehe auch Prefs.js ).

Seit 2004 wird das js- Objekt der grafischen Programmierumgebung Max/MSP verwendet, um auch innerhalb eines Max/MSP-Programms ein Fenster für die Programmierung in JavaScript zu öffnen .

ImageJ- und CaRMetal- Software sind mit JavaScript-Konsolen ausgestattet, die es ihnen ermöglichen, Skripte in einem grafischen Kontext zu schreiben. Algobox verwendet JavaScript für die Syntax seiner Funktionen. H5P verwendet HTML5 und Javascript, um die Erstellung interaktiver Online-Inhalte zu erleichtern.

JavaScript wird auch in BIFS- Inhalten zur Verarbeitung von Ereignissen verwendet. Dafür stellt die BIFS-Spezifikation einen Script-Knoten zur Einbindung von ECMAScript bereit.

Mit der Office-Suite OpenOffice.org können Sie JavaScript als Makrosprache verwenden.

JavaScript kann auch in der Shell oder mit Vista-Gadgets verwendet werden.

Das SVG- Vektorgrafikformat enthält die ECMAscript-Sprache, um interaktive Grafiken zu erstellen, die direkt in einem Browser verwendet werden können.

Schließlich wird JavaScript auch verwendet, um die QML der Qt- Grafikbibliothek zu steigern .

Besonderheiten der Sprache

Identifikatoren verknüpfen

In JavaScript alle Ausdrücke (Bezeichner, Literale und Operatoren und ihre Operanden) von Referenztyp (wie in Python und Ruby - , aber im Gegensatz zu C ++ , Java , C # , Swift und OCaml , die auch haben Werttyp Ausdrücke ), dh zu sagen, dass ihre Auswertung keine Daten direkt ergibt, sondern einen Bezug auf Daten. Die Referenz wird die gerufene referent des Begriffs und der gegebenen genannten Ausdruck.

In JavaScript ändert die Zuweisung einer Variablen ihren Referenten, d . h . sie bindet die Variable an andere Daten: wir sprechen von einer Änderung der Bindung der Variablen (auf englisch variable rebinding ).

var maVariable1 = 0; // lie `maVariable1` à une donnée de valeur 0 var maVariable2 = maVariable1; // lie `maVariable2` à la donnée liée à `maVariable1` maVariable1++; // équivalent à `maVariable1 = maVariable1 + 1;`, relie `maVariable1` à une nouvelle donnée de valeur maVariable1 + 1 (affectation) juin alert(maVariable1); // affiche 1 alert(maVariable2); // affiche 0 var maVariable3 = [1, 2, 3]; // lie `maVariable3` à une donnée de valeur [1, 2, 3] var maVariable4 = maVariable3; // lie `maVariable4` à la donnée liée à `maVariable3` maVariable3 = [4, 5, 6]; // relie `maVariable3` à une nouvelle donnée de valeur [4, 5, 6] (affectation) alert(maVariable3); // affiche [4, 5, 6] alert(maVariable4); // affiche [1, 2, 3] var maVariable5 = [1, 2, 3]; // lie `maVariable5` à une donnée de valeur [1, 2, 3] var maVariable6 = maVariable5; // lie `maVariable6` à la donnée liée à `maVariable5` maVariable5.push(4); // modifie la donnée liée à `maVariable5` et `maVariable6` alert(maVariable5); // affiche [1, 2, 3, 4] alert(maVariable6); // affiche [1, 2, 3, 4]

Lexikalischer Gültigkeitsbereich von Variablen

Der lexikalische Gültigkeitsbereich einer Variablen ist der Teil eines Programms, in dem die Verknüpfung zwischen ihrem Bezeichner und ihren Daten gültig ist. In JavaScript kann der lexikalische Gültigkeitsbereich einer Variablen zwei Arten haben, abhängig vom Schlüsselwort, das verwendet wird, um sie zu deklarieren:

  • var : auf der Ebene der Funktion (oder des globalen Raums), auf der sie deklariert wird (wie in Python , Ruby );
  • letoder const(eingeführt in ECMAScript 6): auf Blockebene , wo sie deklariert wird (wie in C++ , Java , C# ) – eine Funktion ist ein bestimmter Block.
// 1. Déclaration dans un bloc if (true) { // début du bloc var maVariable1; // déclaration de la variable let maVariable2; // déclaration de la variable const maVariable3; // déclaration de la variable } // fin du bloc mais pas de la portée de maVariable1 alert(maVariable1); // ne soulève pas d'erreur alert(maVariable2); // erreur : la variable est hors de sa portée alert(maVariable3); // erreur : la variable est hors de sa portée // 2. Déclaration dans une fonction function maFunction() { // début de la fonction var maVariable4; // déclaration de la variable let maVariable5; // déclaration de la variable const maVariable6; // déclaration de la variable } // fin de la fonction et de la portée des variables alert(maVariable4); // erreur : la variable est hors de sa portée alert(maVariable5); // erreur : la variable est hors de sa portée alert(maVariable6); // erreur : la variable est hors de sa portée

Eine Variable kann durch eine untergeordnete Funktion der Funktion (oder des globalen Raums), in der sie deklariert ist, zugewiesen oder versteckt werden:

var maVariable1 = 0; // définition de la variable parente // 1. Affectation function maFonction1() { // fonction enfant maVariable1 = 1; // affectation de la variable parente } alert(maVariable1); // affiche 0 maFonction1(); // affecte la variable parente alert(maVariable1); // affiche 1 // 2. Masquage var maVariable2 = 0; // définition de la variable parente function maFonction2() { // fonction enfant var maVariable2; // déclaration de la variable enfant masquant la variable parente maVariable2 = 1; // affectation de la variable enfant } alert(maVariable2); // affiche 0 maFonction2(); alert(maVariable2); // affiche 0

Variable Aussage

In JavaScript, unabhängig davon , wo eine Variable in seinem lexikalischen Gültigkeitsbereich deklariert wird, wird die Variable erstellt zu Beginn der Bewertung seines lexikalischen Gültigkeitsbereiches.

Die mit dem Schlüsselwort deklarierten Variablen werden bei ihrer Erstellung varebenfalls mit dem Wert vorinitialisiertundefined und sind daher ab Beginn ihres lexikalischen Geltungsbereichs zugänglich. Wir sprechen über das Erhöhen der Variablen ( hoisting variable auf Englisch), weil es passiert, als ob die Deklaration der Variablen bis zum Anfang ihres lexikalischen Geltungsbereichs gegangen wäre:

alert(maVariable); // affiche undefined var maVariable = 0; alert(maVariable); // affiche 0

Mit dem Schlüsselwort letoder const(ECMAScript 6) deklarierte Variablen sind nicht vorinitialisiert und daher vor ihrer Deklaration nicht zugänglich. Wenn eine mit dem Schlüsselwort deklarierte Variable letkeinen Initialisierer hat, wird sie undefinedbei der Auswertung der Deklaration mit dem Wert initialisiert , andernfalls wird sie bei der Auswertung der Deklaration mit dem Initialisierer initialisiert. Wenn eine mit dem Schlüsselwort deklarierte Variable constkeinen Initialisierer hat, wird bei der Auswertung der Deklaration ein Fehler ausgegeben, andernfalls wird sie bei der Auswertung der Deklaration mit dem Initialisierer initialisiert:

// 1. Avec initialiseur alert(maVariable1); // erreur : accès impossible avant l'initialisation alert(maVariable2); // erreur : accès impossible avant l'initialisation let maVariable1 = 5; const maVariable2 = 8; alert(maVariable1); // affiche 5 alert(maVariable2); // affiche 8 // 2. Sans initialiseur alert(maVariable3); // erreur : accès impossible avant l'initialisation alert(maVariable4); // erreur : accès impossible avant l'initialisation let maVariable3; const maVariable4; // erreur : initialisation manquante alert(maVariable3); // affiche undefined alert(maVariable4); // erreur : initialisation manquante

Darüber hinaus ermöglicht JavaScript die erneute Deklaration derselben Variable in ihrem lexikalischen Geltungsbereich, jedoch nur mit dem Schlüsselwort var :

var maVariable = 2; var maVariable = 9;

Globale Variablen

In JavaScript gibt es mehrere Möglichkeiten, eine globale Variable zu deklarieren , und einige interagieren mit dem globalen Objekt ( windowin Browsern benannt):

var maVariable1 = 0; // propriété ou méthode de l'objet global qui ne peut pas être détruite par l'opérateur delete let maVariable2 = 0; // pas une propriété ou méthode de l'objet global const maVariable3 = 0; // pas une propriété ou méthode de l'objet global maVariable4 = 0; // propriété ou méthode de l'objet global qui peut être détruite par l'opérateur delete window.maVariable5 = 0; // propriété ou méthode de l'objet global qui peut être détruite par l'opérateur delete this.maVariable6 = 0; // propriété ou méthode de l'objet global qui peut être détruite par l'opérateur delete

Eine ohne Deklaration initialisierte Variable wird als globale Variable behandelt:

function maFonction() { maVariable = 5; } maFonction(); alert(maVariable); // affiche 5

Anonyme Funktionen

Die anonymen Funktionen sind, wie der Name schon sagt, Funktionen, die keinen Namen tragen:

setTimeout(function () { alert('Trois secondes se sont écoulées.'); }, 3000);

Dies wird als Parameter an die Funktion übergeben setTimeout, mit der Sie eine Dauer vor der Anzeige der Meldung definieren können.

Lexikalische Schließungen

Eine lexikalische Umgebung ist die Menge gültiger Variablen in einem Teil des Programms. Es besteht aus der internen lexikalischen Umgebung (den lokalen Variablen) und einem Verweis auf die externe lexikalische Umgebung (den nicht-lokalen Variablen).

Eine lexikalische Schließung ( lexikalische Schließung im Englischen ) ist eine Funktion mit ihrer äußeren lexikalischen Umgebung, dh alle nicht-lokalen Variablen, die entweder nach Wert (eine Kopie der Erhaltung jedes mit nicht-lokalen Variablen verknüpften Datenelements) erfasst werden, oder durch Verweis (beibehalten eines Verweises auf jedes Datenelement, das mit nicht-lokalen Variablen verknüpft ist). Da in JavaScript alle Variablen vom Typ Referenz sind (siehe Abschnitt Identifier-Bindung ), verwendet JavaScript nur Capture by Reference - was in C ++ 11 der Syntax entspricht [&](…) { … };- und die Lebensdauer nicht-lokaler Variablen wird auf die Lebensdauer der Funktion verlängert - was in C++ 11 nicht der Fall ist, unabhängig von der Art der Erfassung:

function maFonction() { var maVariable = 4; // variable parente return function () { alert(maVariable); } } var maFermeture = maFonction(); // capture de la variable parente par référence maFermeture(); // affiche 4

Ausdrücke von Funktionen, die sofort aufgerufen werden

Bis ECMAScript 6 bot JavaScript weder nativ Variablenbereich auf Blockebene (keine Schlüsselwörter letoder const) noch Module . Um eine Verschmutzung des globalen Raums zu vermeiden, bestand eine Methode darin, ihren Code in eine Funktion zu kapseln, um sich auf den Gültigkeitsbereich der Variablen zu verlassen, der auf Funktionsebene in JavaScript stattfindet, und dann diese Funktion direkt danach aufzurufen. Um die beiden Schritte (Definition der Funktion und Aufruf) zu kombinieren und keinen zusätzlichen Funktionsnamen im globalen Raum hinzuzufügen, erlaubt die Sprache Ausdrücke von sofort aufgerufenen Funktionen (EFII; im Englischen sofort aufgerufene Funktionsausdrücke , IIFE).

Für diese Art von Ausdruck sind mehrere Syntaxen möglich, die gängigste ist:

  • (function (…) { … }(…));(Syntax von Douglas Crockford wegen ihrer Lesbarkeit empfohlen );
  • (function (…) { … })(…);

Der Funktionsaufrufoperator ()am Ende ermöglicht die sofortige Ausführung der Funktion. Fettgedruckte Klammern teilen dem Parser mit, dass sie einen Ausdruck enthalten, da Klammern in JavaScript keine Deklaration enthalten können. Andernfalls wird das Schlüsselwort in den meisten Situationen functionals Funktionsdeklaration und nicht als Funktionsausdruck behandelt. Es gibt andere Möglichkeiten, einen Funktionsausdruck zu erzwingen:

  • !function (…) { … }(…);
  • ~function (…) { … }(…);
  • -function (…) { … }(…);
  • +function (…) { … }(…);

In Kontexten, in denen ein Ausdruck erwartet wird, ist es nicht erforderlich, fette Klammern zu verwenden:

  • var maVariable = function (…) { … }(…);
  • true && function (…) { … }(…);
  • 0, function (…) { … }(…);

Eine wichtige Verwendung von sofort aufgerufenen Funktionsausdrücken ist das Erstellen von Modulen. Module ermöglichen sowohl das Sammeln von Eigenschaften und Methoden in einem Namespace als auch das Privatisieren bestimmter Member:

var compteur = (function () { var i = 0; // propriété privée return { // méthodes publiques obtenir: function () { alert(i); }, mettre: function (valeur) { i = valeur; }, incrementer: function () { alert(++i); } }; })(); // module compteur.obtenir(); // affiche 0 compteur.mettre(6); compteur.incrementer(); // affiche 7 compteur.incrementer(); // affiche 8 compteur.incrementer(); // affiche 9

Prototypen

Die Prototypen sind Objekte, die während eines Fehlers bei der Namensauflösung verwendet werden. Dieser Mechanismus ist eine Art Vererbung: Prototypvererbung. In JavaScript hat jedes Objekt einen Prototyp, auf den über die Methode zugegriffen werden kann Object.getPrototypeOf(oder über die historische Eigenschaft, die __proto__in ECMAScript 6 standardisiert ist, um die Kompatibilität zwischen Browsern zu gewährleisten, aber nicht empfohlen). Außerdem wird der Operator newverwendet, um den Aufruf einer Konstruktorfunktion in ein Objekt (Instanziierung) umzuwandeln, dessen Prototyp gleich der Eigenschaft prototypeder Konstruktorfunktion ist:

function MonConstructeur() { this.maPropriete1 = 3; } var monInstance = new MonConstructeur(); alert(monInstance.maPropriete1); // affiche 3 alert(Object.getPrototypeOf(monInstance) === MonConstructeur.prototype); // affiche true MonConstructeur.prototype.maPropriete2 = 5; alert(monInstance.maPropriete2); // affiche 5

Jede Instanz von MonConstructeur( monInstancehier) hat einen Prototyp gleich MonConstructeur.prototype. Wenn eine Eigenschaft oder Methode einer Instanz von MonConstructeur( monInstance.maPropriete1und monInstance.maPropriete2hier) verwendet wird, wird die Suche im Prototyp der Instanz ( MonConstructeur.prototypehier) fortgesetzt, wenn die Instanz die gesuchte Eigenschaft oder Methode nicht hat . Schlägt die Suche auch bei diesem Objekt fehl, wird die Suche im Prototyp dieses Objekts fortgesetzt und so weiter, bis die erste Konstruktorfunktion erreicht wird. Wenn die Suche immer noch fehlschlägt, da diese erste Konstruktorfunktion eine Funktion und damit eine Instanz der FunctionSprachkonstruktorfunktion ist , wird die Suche in ihrem Prototyp fortgesetzt, der gleich ist Function.prototype. Wenn die Suche erneut fehlschlägt, da Function.prototypees sich um ein Objekt und damit eine Instanz der ObjectSprachkonstruktorfunktion handelt, wird die Suche in ihrem Prototyp fortgesetzt, der gleich ist Object.prototype. Wenn die Suche dieses Mal fehlschlägt, weil der Prototyp von Object.prototypeequals ist null, wird die Suche abgebrochen und JavaScript generiert einen Namensauflösungsfehler. Dieser Suchmechanismus durchläuft die sogenannte Prototypenkette .

Der Betreibercode instanceOfveranschaulicht diesen Mechanismus gut. A instanceOf B(oder äquivalent instanceOf.call(A, B):) gibt trueif Ais eine Instanz von B, d. h. if B.prototypein der Prototypkette von gefunden wird A, und falseandernfalls:

function instanceOf(f) { var o = this; while (o !== null) { if (Object.getPrototypeOf(o) === f.prototype) { return true; } o = Object.getPrototypeOf(o); } return false; }

Darüber hinaus Object.createermöglicht es die in ECMAScript 5 eingeführte Methode, die direkte Verwendung der Konstruktorfunktionen, ihrer Eigenschaften prototypeund des Operators zu vermeiden new, um nur mit Objekten zu arbeiten. Die Verwendung dieser Methode vereinfacht die Komplexität des Codes erheblich und wird daher empfohlen. Die Methode Object.createist definiert durch

if (typeof Object.create !== 'function') { Object.create = function (o) { function F() {} F.prototype = o; return new F(); }; }

Das vorherige Beispiel kann dann umgeschrieben werden

var MonObjet = { function initialiser() { this.maPropriete1 = 3; } } var monInstance = Object.create(MonObjet); monInstance.initialiser(); alert(monInstance.maPropriete1); // affiche 3 MonObjet.maPropriete2 = 5; alert(monInstance.maPropriete2); // affiche 5

Trennung von Anweisungen

In C endet jede Anweisung mit einem Semikolon . Diese Praxis hat das Semikolon in vielen von der C-Syntax inspirierten Sprachen zu einer Anforderung gemacht.

JavaScript ist flexibler, da ein Zeilenende das Ende einer Anweisung implizit markieren kann. Ziel ist es, den Umgang mit der Sprache für Personen zu erleichtern, die in der Computerprogrammierung unerfahren sind . Diese Flexibilität führt jedoch zu unerwarteten Effekten:

return true;

Der Parser versteht dies als zwei Anweisungen:

return; true;

Funktionsausdrücke, die sofort aufgerufen werden, wenn der Programmierer auf implizite Befehlsenden angewiesen ist, stoßen bei der Verwendung von Klammern ebenfalls auf dieses Problem:

maVariable1 = maVariable2 + maVariable3 (function () { // code })()

wird behandelt als

maVariable1 = maVariable2 + maVariable3(function () { /* code */ })();

Bücher für fortgeschrittene JavaScript-Programmierung warnen vor den unerwarteten Auswirkungen der automatischen Ableitung am Ende der Anweisung und raten dazu, am Ende jeder Anweisung ein Semikolon zu schreiben, was Überraschungen beim Vergessen des Semikolons nicht verhindert, insbesondere wenn die Codekomprimierung das Entfernen von Wagenrückläufen erfordert.

Anhänge

Zum Thema passende Artikel

Externe Links

Hinweise und Referenzen

  1. Douglas Crockford , in einem Vortrag bei Yahoo! Crockford über JavaScript - Kapitel 2: And Then There Was JavaScript , beschränkt auf Java, Scheme und Self als direkter Einfluss von JavaScript
  2. David Flanagan , JavaScript: The Definitive Guide , 6 th  ed. , s.  1

    „JavaScript ist Teil des Dreiklangs von Technologien, die alle Webentwickler lernen müssen: HTML zur Angabe des Inhalts von Webseiten, CSS zur Angabe der Darstellung von Webseiten und JavaScript zur Angabe des Verhaltens von Webseiten. "

  3. (in) „  Usage Statistics of JavaScript for Websites, March 2018  “ auf w3techs.com (Zugriff am 3. Oktober 2018 )
  4. (in) "  Eine Einführung in JavaScript  " auf javascript.info (Zugriff am 20. Juli 2020 )
  5. „  Modulecounts  “ auf www.modulecounts.com (Zugriff am 5. August 2017 )
  6. (de) http://wiki.commonjs.org/wiki/CommonJS
  7. (in) Node.js Foundation , „  Node.js  “ auf Node.js (Zugriff am 5. August 2017 )
  8. (in) Liam Tung , "  Deno 1.0: Node.js JavaScript Runtime Maker haben neue Programmiersprache für Typoskript  " auf ZDNet (Zugriff am 20. Juli 2020 )
  9. TechVision: Innovatoren des Netzes: Brendan Eich und JavaScript
  10. (in) NETSCAPE UND SUN KÜNDIGEN JAVASCRIPT AN, DIE OFFENE PLATTFORMÜBERGREIFENDE OBJEKTSKRIPTERSPRACHE FÜR UNTERNEHMENSNETZE UND DAS INTERNET
  11. "  Was ist der Unterschied zwischen Java und JavaScript?" - Quora  “ , auf fr.quora.com (Zugriff am 5. August 2017 )
  12. (in) "  Trademark Document Retrieval & Status  " auf tsdr.uspto.gov (Zugriff am 28. Juni 2018 )
  13. "Sun Trademarks" (Version vom 28. Mai 2010 im Internetarchiv ) ,28. Mai 2010
  14. „  Standard ECMA-262  “ , unter www.ecma-international.org (Zugriff am 2. Oktober 2019 )
  15. "  JavaScript sicher für Werbung machen  " , ADsafe (Zugriff am 26. Mai 2013 )
  16. „  Sicheres ECMA-Skript (SES)  “ , Code.google.com (Zugriff am 26. Mai 2013 )
  17. "  Warum wird console.log () als besser angesehen als alert ()?  » , Auf stackoverflow.com (Zugriff am 5. August 2017 )
  18. (en-US) „  Window  “ , vom Mozilla Developer Network (Zugriff am 5. August 2017 )
  19. (in) "  Globale Objekte | Node.js v8.2.1 Documentation  “ , auf nodejs.org (Zugriff am 5. August 2017 )
  20. (in) "  IEBlog  " auf msdn.com (Zugriff am 29. September 2020 ) .
  21. Siehe Einführung in die JavaScript-Shell
  22. (in) Ben Alman , "  Sofort aufgerufener Funktionsausdruck (IIEF)  " auf benalman.com ,15. November 2010(Zugriff am 14. Mai 2016 )
  23. (in) Douglas Crockford , „  Code Conventions for the JavaScript Programming Language  “ auf javascript.crockford.com (Zugriff am 14. Mai 2016 )
  24. Dieses Beispiel wird auf Seite 25 gegeben von: JavaScript - The Definitive Guide , Fourth Edition, David Flanagan, O'Reilly Media editions , Sebastopol, California.