JavaScript

JavaScript
Logo.
Obraz poglądowy artykułu JavaScript
Data pierwszej wersji maj 1996
Paradygmat Multi-paradygmaty  : skrypty , obiekt zorientowanych ( prototyp zorientowanych ), nadrzędne , funkcjonalny
Autor Brendan Eich
Deweloperzy Netscape Communications Corporation , Fundacja Mozilla
Ostatnia wersja 11 - ES2020 (czerwiec 2020)
Pisanie na maszynie dynamiczny , słaby
Normy ECMA-262
ISO/IEC 16262
Dialekty JavaScript, JScript , ECMAScript
Wpływem Self , Schemat , Perl , C , C ++ , Java , Python
Pod wpływem JScript , JScript .NET , Objective-J , TIScript
Realizacje SpiderMonkey , Rhino , KJS , JavaScriptCore , V8
Stronie internetowej Mozilla
Rozszerzenie pliku js

JavaScript to język programowania od skryptów wykorzystywanych głównie w stronach internetowych interaktywnych i jako taki jest istotnym elementem aplikacji internetowych . Wraz z technologiami HTML i CSS , JavaScript jest czasami uważany za jedną z podstawowych technologii World Wide Web . Korzysta z niego znaczna większość witryn internetowych , a większość przeglądarek internetowych ma dedykowany silnik JavaScript do jego interpretacji , bez względu na kwestie bezpieczeństwa, które mogą się pojawić w razie potrzeby.

Jest to język zorientowany od obiektu do prototypu  : podstawy języka i jego główne interfejsy są dostarczane przez obiekty .

Jednak w przeciwieństwie do języka obiektowego, obiekty bazowe nie są przypadki z klas .

Każdy obiekt bazowy (np. dokument lub obiekt windows) ma swój własny model, który pozwoli mu tworzyć instancje obiektów potomnych za pomocą konstruktorów wykorzystujących jego właściwości. Na przykład właściwość prototyping pozwoli im tworzyć niestandardowe obiekty spadkowe .

Ponadto funkcjeobiektami pierwszej klasy . Język wspiera paradygmat przedmiotowy , imperatywny i funkcjonalny . JavaScript jest językiem o największym ekosystemie dzięki menedżerowi zależności npm , z około 500 000 pakietów wsierpień 2017.

JavaScript został stworzony w 1995 roku przez Brendana Eicha . To był standaryzowany pod nazwą ECMAScript wCzerwiec 1997przez Ecma International w standardzie ECMA-262. Obecnie obowiązująca wersja tego standardu, od czerwca 2020 r., to 11. edycja.

JavaScript jest implementacją ECMAScript, implementowaną przez Mozilla Foundation . Implementacja ECMAScript przez Microsoft (w Internet Explorerze do wersji 9) nazywa się JScript , podczas gdy implementacja Adobe Systems nazywa się ActionScript .

JavaScript jest również używany dla serwerów z wykorzystaniem (na przykład) Node.js lub Deno .

Historia

Początek

Język został stworzony w ciągu dziesięciu dni w maju 1995 roku na zlecenie Netscape Communications Corporation przez Brendana Eicha , który zainspirował się wieloma językami, zwłaszcza Javą, ale upraszczając składnię dla początkujących. Brendan Eich początkowo opracował język skryptowy po stronie serwera o nazwie LiveScript, aby wzmocnić ofertę komercyjną serwera HTTP dla Mosaic Communications Corporation . Wydanie LiveScript nastąpiło w czasie, gdy NCSA zmusiło Mosaic Communications Corporation do zmiany nazwy na Netscape Communications Corporation, która pracowała wówczas nad rozwojem wersji LiveScript zorientowanej na klienta. Kilka dni przed wydaniem Netscape zmienia nazwę LiveScript na JavaScript. Sun Microsystems i Netscape były partnerami, a coraz bardziej popularna Java Virtual Machine . Ta zmiana nazwy służyła interesom obu firm.

W grudzień 1995, Sun i Netscape ogłaszają wydanie JavaScript. WMarzec 1996Netscape implementuje mechanizm JavaScript w swojej przeglądarce internetowej Netscape Navigator 2.0. Sukces tej przeglądarki przyczynia się do szybkiego przyjęcia JavaScript w tworzeniu stron internetowych zorientowanych na klienta. Microsoft następnie reaguje, rozwijając JScript , który następnie dołącza do Internet Explorera 3.0 przezsierpień 1996 do wyjścia z przeglądarki.

JavaScript jest opisany jako dodatek do Javy we wspólnym komunikacie prasowym Netscape i Sun Microsystems z dnia4 grudnia 1995. Ta inicjatywa pomogła wywołać wśród opinii publicznej zamieszanie między tymi dwoma językami, które są syntaktycznie podobne, ale w ogóle nie pod względem podstawowych pojęć, i które trwa do dziś.

„JavaScript” staje się zarejestrowanym znakiem towarowym firmy Oracle w Stanach Zjednoczonych wmaj 1997.

Normalizacja

Następnie Netscape przesyła JavaScript do Ecma International w celu standaryzacji.

Wersja 1: Narodziny standardu ECMA-262

Praca zaczyna się za Listopad 1996 i kończy się w Czerwiec 1997Dając początek do 1 st  edycji standardu ECMA-262, który określa język ECMAScript . Norma jest następnie przesyłana do ISO/IEC i publikowana wkwiecień 1998 jako międzynarodowa norma ISO/IEC 16262.

Wersja 2: Homogenizacja z normą ISO/IEC 16262

Zmiany redakcyjne są wykonane ze standardem ECMA-262 w celu dostosowania go do międzynarodowej normie ISO / IEC 16262, w wyniku 2 nd  edycji standardu ECMA-262 wczerwiec 1998.

Wersja 3: Usprawnienia i konstytucja języka

3 p  wydanie standardu ECMA-262 wprowadzono:

  • wydajniejsze wyrażenia regularne,
  • poprawiona obsługa ciągów znaków,
  • nowe instrukcje sterowania,
  • obsługa wyjątków za pomocą instrukcji try/catch
  • formatowanie liczb.

Jest publikowany przez Ecma International in grudzień 1999 następnie przedłożone do ISO / IEC, które publikuje międzynarodową normę ISO / IEC 16262: 2002 w czerwiec 2002. Po publikacji w 3 -ciej  edycji następuje masowe przyjęcie przez wszystkich przeglądarek internetowych.

Wersja 4: Nieukończony etap

Konsekwentne prace podejmowane w celu rozwijania 4 th  wydanie standardu ECMA-262, ale nie zostaną zakończone w tym roku i nigdy nie ujrzy dzień. Jednakże, część wywoływania prowadzony będzie włączona do 6 th  edition.

Wersja 5: Ujednoznacznienie i nowe funkcje

5 th  edycja ECMA-262 standardowych wyjaśnia niejasności z 3 th  edition i wprowadza getters, introspekcja, atrybuty sterujące, dodatkowe funkcje manipulacji tabel, wsparcie formatu JSON i tryb ścisły dla sprawdzania błędów. Jest publikowany przez Ecma International ingrudzień 2009 następnie przedłożone do ISO/IEC, które wprowadza drobne poprawki i publikuje międzynarodową normę ISO/IEC 16262:2011 w czerwiec 2011. Wydanie 5.1 normy ECMA-262, identyczne z tekstem normy międzynarodowej ISO/IEC 16262:2011, zostało opublikowane w tym samym dniu.

Wersja 6: Ulepszone wsparcie i funkcjonalność

Chociaż rozwój 6 th  edycja standardu ECMA-262 rozpoczęła się oficjalnie w 2009 roku, na krótko przed publikacją 5 th  Edition, została opublikowana wczerwiec 2015jest rzeczywiście zwieńczeniem 15 lat pracy od opublikowania 3 rd  edycji w roku 1999. Celem 6 th  Edition to zapewnić lepszą obsługę aplikacji na dużą skalę, tworzenie bibliotek i korzystania z ECMAScript jako kompilacja cel dla innych języków. Wydanie to w szczególności wprowadza moduły, klasy, zakres leksykalny na poziomie bloków, iteratory i generatory, obietnice programowania asynchronicznego, wzorce destrukturyzacji, optymalizację wywołań terminali, nowe struktury danych (tablice asocjacyjne, zestawy, tablice binarne), obsługę dodatkowych znaków Unicode w ciągach i wyrażeniach regularnych oraz możliwość rozszerzania predefiniowanych struktur danych.

Od wersji 7 do dnia dzisiejszego: stała adaptacja do narzędzi internetowych

7 th  edycja standardu ECMA-262 Edition to pierwszy numer nowego procesu rozwoju otwartego i roczna publikacja tempie przyjęty przez Komitet ECMA TC39. Dokument tekstowy jest tworzony od 6 -tego  wydania i jest delegowany na GitHub jako bazę dla rozwoju tej nowej edycji. Po korekcie tysięcy błędów i błędy redakcyjne, a także wprowadzenia operatora potęgowania i nowego sposobu płyt prototypowych The 7 th  wydanie zostało opublikowane wczerwiec 2016.

Obecna edycja standardu ECMA-262 jest 11. edycją wydaną w czerwcu 2020 roku.

bezpieczeństwo

JavaScript i struktura DOM stron HTML / XML mają pewne luki w zabezpieczeniach. Dzieje się tak, ponieważ złośliwe skrypty mogą ukryć się w kodzie strony internetowej i wykonać na docelowym komputerze użytkownika sieci.

Dostawcy przeglądarek internetowych próbują zmniejszyć to ryzyko za pomocą dwóch ograniczeń:

  • Jednym z nich jest uruchomienie tych skryptów w przestrzeni oddzielonej od innych danych ( piaskownica ), w której mogą być wykonywane tylko działania związane z siecią (ruchy myszy, wyświetlanie pikseli, komunikacja) bez dostępu do systemu plików.
  • Drugim jest uruchamianie skryptów tylko w ramach polityki tego samego pochodzenia  : mając to na uwadze, witryna nie powinna mieć dostępu do informacji, takich jak nazwy użytkownika i hasła lub pliki cookie otrzymane z innych odwiedzanych witryn.

Luki w JavaScript są często naruszeniem przynajmniej jednej z tych dwóch zasad.

Niektóre podzbiory języka JavaScript, takie jak JavaScript — ADsafe lub Secure ECMAScript (SES), zapewniają wyższy poziom bezpieczeństwa, zwłaszcza w przypadku skryptów tworzonych przez strony trzecie (zwłaszcza reklam). Caja to kolejne oprogramowanie do bezpiecznego osadzania i izolowania JavaScript i HTML innych firm.

Content Security Policy jest podstawową metodą dla zapewnienia, że tylko zaufane skrypt wykonywany jest na stronie internetowej. Meltdown to podatność niezależna od JavaScript, która może być wykorzystana w szczególności w JavaScript.

Koncepcje programowania

Celem JavaScript jest łatwe manipulowanie obiektami , w sensie komputerowym, dostarczanymi przez aplikację hosta. Na przykład w przeglądarce internetowej skrypt napisany w javascript może zostać użyty do dodania interaktywnego lub dynamicznego dotyku do aplikacji (strony lub witryny internetowej), która w przeciwnym razie byłaby zamrożoną statyczną stroną. Język Javascript umożliwia na przykład pisanie skryptów, które wyświetlają lub ukrywają akapit, obraz lub wyskakujące okienko, zgodnie z interakcjami użytkownika lub informują serwer o czasie spędzonym na czytaniu strony.

Bonjour Monde

W skrypcie w języku JavaScript można wyświetlić tekst hello world w konsoli debugowania aplikacji. Może to być wykorzystane przez programistów w fazie rozwoju. :

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

W aplikacji hosta przeglądarki konsola jest jedną z metod globalnego obiektu window . W innych aplikacjach hosta, takich jak Node.js , obiekt globalny jest globalny . Ponieważ metody obiektu globalnego są dostępne bez prefiksu, window i global są opcjonalne.

Składnia

console.log('Hello world');

w związku z tym będzie miał dokładnie taki sam wynik, oprócz tego, że będzie kompatybilny we wszystkich środowiskach.

posługiwać się

Kod JavaScript potrzebuje obiektu globalnego do dołączania do niego deklaracji ( zmiennych i funkcji) przed wykonaniem instrukcji. Najbardziej znaną sytuacją jest sytuacja z obiektem window uzyskanym w kontekście strony internetowej. Możliwe są inne środowiska, w tym dostarczone przez firmę Adobe lub środowisko Node.js (patrz Inne zastosowania poniżej).

Na stronie internetowej

Kod JavaScript można zintegrować bezpośrednio ze stronami internetowymi i wykonać na stacji roboczej klienta . To przeglądarka internetowa odpowiada za wykonanie tych programów, zwanych skryptami.

Ogólnie rzecz biorąc, JavaScript jest używany do kontrolowania danych wprowadzanych w formularzach HTML lub do interakcji z dokumentem HTML za pośrednictwem interfejsu Document Object Model udostępnianego przez przeglądarkę (jest to czasami określane jako dynamiczny HTML lub DHTML). Służy również do tworzenia dynamicznych aplikacji, przejść, animacji lub manipulowania reaktywnymi danymi w celach ergonomicznych lub kosmetycznych.

JavaScript nie ogranicza się do manipulowania dokumentami HTML i może być również używany do manipulowania SVG , XUL i innymi dialektami XML .

Niezgodność

Netscape i Microsoft (z JScript w Internet Explorer do wersji 9) opracowały własny wariant tego języka, z których każdy prawie w pełni obsługuje standard ECMAScript, ale posiada dodatkowe i niekompatybilne funkcje, rzadko używane w kontekście programowania stron internetowych. Jednak skrypty JavaScript są często źródłem trudności. Częściej wynikają z obsługi różnych wersji modeli obiektów ( DOM ) zapewnianych przez przeglądarki, niż z problemów z przenośnością języka (różne implementacje stosunkowo dobrze respektują standard ECMAScript).

Aby dynamicznie sprawdzić, czy obiekt (w wersji JavaScript używanej podczas interpretacji) rzeczywiście posiada metodę, często używamy konstrukcji typu:

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

W ten sposób sprawdzamy, czy myObjet rzeczywiście ma implementację metody , której możemy następnie użyć. Najczęściej, jeśli przeglądarka nie obsługuje metodę z myObject , obsługuje porównywalną metodą Method2 i możemy następnie dostosować kod JavaScript do przeglądarki, który wykonuje go:

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

Inną metodą jest sprawdzenie po stronie serwera przeglądarki używanej przez klienta i przesłanie odpowiedniego kodu. Nie jest to jednak wskazane, ponieważ znacznie lepiej jest bezpośrednio testować istnienie, zachowanie funkcji, właściwości  itp. zamiast robić domniemania na podstawie wykrywania przeglądarki.

Ajaks

Ajax (z angielskiego Asynchronous JavaScript And XML ) to zestaw technik oddzielających wymianę danych między przeglądarką a serwerem WWW od wyświetlania strony internetowej, co umożliwia modyfikowanie zawartości stron internetowych bez ich ładowania. Dzięki obiektowi XMLHTTPRequest JavaScript metoda ta umożliwia wykonywanie żądań HTTP na serwerze WWW z przeglądarki internetowej, a także przetwarzanie odpowiedzi HTTP z serwera WWW w celu modyfikacji zawartości strony WWW. Odpowiedź była ogólnie w formacie XML , który obecnie jest zastępowany formatem JSON , który ma tę zaletę, że jest natywny dla JavaScript. Skrypt manipuluje zestawem obiektów DOM, które reprezentują zawartość strony internetowej. Technologie XMLHTTPRequest , XML i DOM zostały dodane do przeglądarek internetowych w latach 1995-2005. Metoda Ajax umożliwia tworzenie bogatych aplikacji internetowych , oferując większą łatwość zarządzania i wygodę; jest to jeden z kluczowych tematów ruchu Web 2.0 .

JSON

JSON ( JavaScript Object Notation ) to format wykorzystujący notację obiektów JavaScript do przesyłania uporządkowanych informacji w bardziej zwarty sposób i bliższy językom programowania niż XML.

Pomimo istnienia DOM i niedawnego wprowadzenia E4X (patrz poniżej) w specyfikacji języka JavaScript, JSON pozostaje najłatwiejszym sposobem dostępu do danych, ponieważ każdy strumień JSON jest niczym innym jak zserializowanym obiektem JavaScript. Co więcej, pomimo historycznego (i technicznego) powiązania z JavaScript, JSON pozostaje ustrukturyzowanym formatem danych i może być z łatwością używany przez wszystkie języki programowania.

Od 2009 roku przeglądarki zaczęły integrować natywną obsługę formatu JSON, co ułatwia jego obsługę, bezpieczeństwo (przed oceną złośliwych skryptów zawartych w ciągu JSON) i szybkość przetwarzania. W ten sposób przeglądarki Firefox i IE integrują go odpowiednio od wersji 3.5 i 8.

Przykład JSON:

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

Struktura jest zorganizowana według klucza/wartości. Klucze muszą być ujęte w cudzysłów. Wartości mogą być:

  • string (ciąg znaków między podwójnymi cudzysłowami)
  • numer
  • wartość logiczna (prawda lub fałsz dla prawdy lub fałszu)
  • struktura klucza / wartości

Prawidłowy JSON nie może zawierać komentarzy. W Internecie dostępne są walidatory JSON.

Inne zastosowania

Na serwerze WWW

JavaScript może być również używany jako język programowania na serwerze HTTP, podobnie jak języki takie jak PHP , ASP , itp. Poza tym projekt CommonJS działa w celu określenia ekosystemu dla JavaScript poza przeglądarką (na przykład na serwerze lub dla natywnych aplikacji desktopowych). Projekt rozpoczął Kevin Dangoor wstyczeń 2009. Projekt CommonJS nie jest powiązany z grupą Ecma International TC39 pracującą nad ECMAScript, ale niektórzy członkowie TC39 są zaangażowani w projekt.

Historycznie, JavaScript był proponowany na serwerach Netscape, które były następnie dystrybuowane przez Sun Microsystems pod nazwami iPlanet i Sun ONE , ale JScript może być używany na serwerach Internet Information Services firmy Microsoft . JScript może być również używany do tworzenia skryptów na platformie Microsoft Windows za pośrednictwem Windows Scripting Host (WSH).

Istnieją również niezależne i Open Source projekty wdrożeniowe serwerów w JavaScript. Wśród nich możemy wyróżnić Node.js , wszechstronną platformę do tworzenia aplikacji sieciowych opartą na silniku JavaScript V8 i specyfikacjach CommonJS .

Inne media

ActionScript , używany w Adobe Flash , jest również implementacją ECMAScript. Pozwala obsłużyć wszystkie elementy animacji, traktowane jako obiekty. JavaScript może być używany do skryptowania innych aplikacji Adobe ( Photoshop , Illustrator , itp.), co pozwala na tworzenie skryptów niezależnych od platformy (Microsoft Windows, Apple OSX, Linux itp.).

JavaScript jest wreszcie używany w platformie deweloperskiej Mozilli , na której bazuje kilka programów, takich jak przeglądarki internetowe , do zadań związanych z interfejsem użytkownika i komunikacją wewnętrzną (np.: rozszerzenia Firefox i Thunderbird są instalowane w oparciu o pliki XPI z wykorzystaniem JavaScript Zobacz także Prefs.js ).

Od 2004 roku obiekt js graficznego środowiska programistycznego Max/MSP służy do otwierania okna do programowania w JavaScript, nawet w ramach programu Max/MSP .

Oprogramowanie ImageJ i CarMetal wyposażone są w konsole JavaScript, które umożliwiają pisanie skryptów w kontekście graficznym. Algobox używa JavaScript do składni swoich funkcji. H5P wykorzystuje HTML5 i Javascript, aby ułatwić tworzenie interaktywnych treści online.

JavaScript jest również używany w treści BIFS do przetwarzania zdarzeń. W tym celu specyfikacja BIFS zapewnia węzeł skryptu do włączenia ECMAScript.

Pakiet biurowy OpenOffice.org umożliwia używanie JavaScript jako języka makr.

JavaScript może być również używany w powłoce lub z gadżetami Vista.

Format grafiki wektorowej SVG zawiera język ECMAscript do tworzenia interaktywnych grafik, które można wykorzystać bezpośrednio w przeglądarce.

Wreszcie, JavaScript jest również używany do ulepszania QML biblioteki graficznej Qt .

Cechy szczególne języka

Łączenie identyfikatorów

W JavaScript wszystkie wyrażenia (identyfikatory, literały i operatory oraz ich operandy) są typu referencyjnego (podobnie jak w Pythonie i Ruby , ale w przeciwieństwie do C++ , Java , C# , Swift i OCaml , które również mają wyrażenia typu wartości ) , czyli powiedzieć, że ich ocena nie daje bezpośrednio danych, ale odniesienie do danych. Odwołanie jest nazywane referentem terminu i otrzymuje odesłane wyrażenie.

W JavaScript przypisanie zmiennej modyfikuje jej referent, innymi słowy wiąże zmienną z innymi danymi: mówimy o zmianie powiązania zmiennej (w języku angielskim zmienna 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]

Zakres leksykalny zmiennych

Zakres leksykalny zmiennej to ta część programu, w której obowiązuje związek między jej identyfikatorem a danymi. W JavaScript zakres leksykalny zmiennej może być dwojakiego rodzaju, w zależności od słowa kluczowego użytego do jej deklaracji:

  • var : na poziomie funkcji (lub przestrzeni globalnej), gdzie jest zadeklarowana (jak w Pythonie , Ruby );
  • letlub const(wprowadzone w ECMAScript 6): na poziomie bloku , w którym jest zadeklarowana (jak w C++ , Java , C# ) - funkcja będąca konkretnym blokiem.
// 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

Zmienna może być przypisana lub ukryta przez funkcję potomną funkcji (lub przestrzeni globalnej), w której jest zadeklarowana:

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

Deklaracja zmiennej

W JavaScript, niezależnie od tego, gdzie zmienna jest zadeklarowana w swoim zakresie leksykalnym, zmienna jest tworzona na początku oceny jej zakresu leksykalnego.

Zmienne zadeklarowane za pomocą słowa kluczowego varsą również wstępnie inicjowane do wartości undefinedpodczas ich tworzenia, a zatem są dostępne od początku ich zakresu leksykalnego. Mówimy o podnoszeniu zmiennej (po polsku hoisting variable ), ponieważ dzieje się to tak, jakby deklaracja zmiennej doszła do początku jej zakresu leksykalnego:

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

Zmienne zadeklarowane za pomocą słowa kluczowego letlub const(ECMAScript 6) nie są wstępnie zainicjalizowane i dlatego są niedostępne przed ich deklaracją. Jeśli zmienna zadeklarowana za pomocą słowa kluczowego letnie ma inicjatora, jest inicjowana do wartości undefinedpodczas oceny deklaracji, w przeciwnym razie jest inicjowana za pomocą inicjatora podczas oceny deklaracji. Jeśli zmienna zadeklarowana za pomocą słowa kluczowego constnie ma inicjatora, podczas oceny deklaracji zgłaszany jest błąd, w przeciwnym razie jest inicjowana za pomocą inicjatora podczas oceny deklaracji:

// 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

Dodatkowo JavaScript pozwala na ponowne zadeklarowanie tej samej zmiennej w jej zakresie leksykalnym, ale tylko ze słowem kluczowym var :

var maVariable = 2; var maVariable = 9;

Zmienne globalne

W JavaScript istnieje kilka sposobów deklarowania zmiennej globalnej , a niektóre wchodzą w interakcję z obiektem globalnym (nazywanym windoww przeglądarkach):

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

Zmienna zainicjowana bez deklaracji jest traktowana jako zmienna globalna:

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

Funkcje anonimowe

Funkcje anonimowe to, jak sama nazwa wskazuje, funkcje, które nie noszą nazwy:

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

Jest on podawany jako parametr funkcji setTimeout, który pozwala na zdefiniowanie czasu trwania przed wyświetleniem komunikatu.

Zamknięcia leksykalne

Środowisko leksykalny jest zbiorem ważnych zmiennych w ramach programu. Składa się na nią wewnętrzne środowisko leksykalne (zmienne lokalne) oraz odniesienie do zewnętrznego środowiska leksykalnego (zmienne nielokalne).

Leksykalny zamknięcie ( leksykalne zamknięcie w języku angielskim) jest funkcją z jej zewnętrznym otoczeniu leksykalnym, czyli wszystkie zmienne non-local że złapanych albo przez wartość (kopia ochrony każda pozycja danych związanej zmiennych nielokalnych) lub przez odniesienie (zachowując odniesienie do każdego elementu danych połączonego ze zmiennymi nielokalnymi). Tak jak w JavaScript wszystkie zmienne są typu referencyjnego (patrz rozdział Powiązanie identyfikatora ), JavaScript używa tylko przechwytywania przez referencję - co w C++ 11 odpowiada składni [&](…) { … };- i czasu życia zmiennych nielokalnych. wydłuża się o czas życia funkcji - co nie ma miejsca w C++ 11, niezależnie od rodzaju przechwytywania:

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

Wyrażenia funkcji natychmiast wywoływanych

Do ECMAScript 6 JavaScript nie oferował natywnie zakresów zmiennych na poziomie bloku (bez słów kluczowych letlub const) ani modułów . Aby uniknąć zanieczyszczenia globalnej przestrzeni, jedną z metod było zamknięcie kodu w funkcji, która polegała na zakresie zmiennych, który ma miejsce na poziomie funkcji w JavaScript, a następnie wywołanie tej funkcji zaraz po. Aby połączyć dwa kroki (definicję funkcji i wywołania) i nie dodawać dodatkowej nazwy funkcji w przestrzeni globalnej, język umożliwia wyrażenia funkcji natychmiast wywoływanych (EFII; w języku angielskim natychmiast wywoływane wyrażenia funkcji , IIFE) .

Dla tego typu wyrażeń możliwych jest kilka składni, z których najczęstszą jest:

  • (function (…) { … }(…));(składnia zalecana przez Douglasa Crockforda ze względu na jej czytelność);
  • (function (…) { … })(…);

Operator wywołania funkcji ()na końcu umożliwia natychmiastowe wykonanie funkcji. Pogrubione nawiasy informują parser, że zawierają wyrażenie, ponieważ w JavaScript nawiasy nie mogą zawierać deklaracji. W przeciwnym razie w większości sytuacji słowo kluczowe functionjest traktowane jako deklaracja funkcji, a nie wyrażenie funkcji. Istnieją inne sposoby wymuszenia wyrażenia funkcji:

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

W kontekstach, w których oczekiwane jest wyrażenie, nie jest konieczne używanie pogrubionych nawiasów:

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

Ważnym zastosowaniem natychmiast wywoływanych wyrażeń funkcyjnych jest budowanie modułów. Moduły umożliwiają zarówno zbieranie właściwości i metod w przestrzeni nazw, jak i uczynienie niektórych członków prywatnymi:

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

Prototypy

Te prototypy są przedmioty używane podczas awarii rozpoznawania nazw. Ten mechanizm jest rodzajem dziedziczenia: dziedziczeniem prototypu. W JavaScript każdy obiekt ma prototyp, dostępny za pośrednictwem metody Object.getPrototypeOf(lub poprzez właściwość historyczną __proto__ustandaryzowaną w ECMAScript 6, aby zapewnić kompatybilność między przeglądarkami, ale nie jest to zalecane). Dodatkowo operator newsłuży do przekształcenia wywołania funkcji konstruktora na obiekt (instancję), którego prototyp jest równy właściwości prototypefunkcji konstruktora:

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

Każde wystąpienie MonConstructeur( monInstancetutaj) ma prototyp równy MonConstructeur.prototype. Podczas korzystania z właściwości lub metody instancji MonConstructeur( monInstance.maPropriete1i monInstance.maPropriete2tutaj), jeśli instancja nie ma poszukiwanej właściwości lub metody, wyszukiwanie jest kontynuowane w prototypie instancji ( MonConstructeur.prototypetutaj). Jeśli wyszukiwanie nie powiedzie się również z tym obiektem, wyszukiwanie jest kontynuowane w prototypie tego obiektu i tak dalej, aż do osiągnięcia pierwszej funkcji konstruktora. Jeśli wyszukiwanie nadal się nie powiedzie, ponieważ pierwsza funkcja konstruktora jest funkcją, a zatem instancją funkcji konstruktora Functionjęzyka , wyszukiwanie jest kontynuowane w swoim prototypie, który jest równy Function.prototype. Jeśli wyszukiwanie ponownie się nie powiedzie, Function.prototypebędąc obiektem, a zatem instancją funkcji konstruktora Objectjęzyka , wyszukiwanie jest kontynuowane w swoim prototypie, który jest równy Object.prototype. Jeśli tym razem wyszukiwanie się nie powiedzie, ponieważ prototyp Object.prototypeequals null, wyszukiwanie zostanie zatrzymane, a JavaScript wygeneruje błąd rozpoznawania nazw. Ten mechanizm wyszukiwania przechodzi przez tak zwany łańcuch prototypów .

Kod operatora instanceOfdobrze ilustruje ten mechanizm. A instanceOf B(lub równoważnie instanceOf.call(A, B):) zwraca trueif Ajest instancją B, to znaczy if B.prototypeznajduje się w łańcuchu prototypów A, a w falseprzeciwnym razie:

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

Dodatkowo metoda Object.createwprowadzona w ECMAScript 5 pozwala uniknąć bezpośredniego używania funkcji konstruktora, ich właściwości prototypeoraz operatora new, aby pracować tylko z obiektami. Korzystanie z tej metody znacznie upraszcza złożoność kodu i dlatego jest zalecane. Metoda Object.createjest zdefiniowana przez

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

Poprzedni przykład można następnie przepisać

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

Separacja instrukcji

W C każda instrukcja kończy się średnikiem . Ta praktyka sprawiła, że ​​średnik jest wymagany w wielu językach inspirowanych składnią C.

JavaScript jest bardziej elastyczny, pozwalając, by koniec linii niejawnie oznaczał koniec instrukcji. Celem jest ułatwienie posługiwania się językiem osobom niedoświadczonym w programowaniu komputerowym . Ale ta elastyczność wprowadza nieoczekiwane efekty:

return true;

Parser rozumie to jako dwie instrukcje:

return; true;

Wyrażenia funkcyjne wywoływane natychmiast, gdy programista polega na niejawnych zakończeniach instrukcji, również napotykają ten rodzaj problemu przy użyciu nawiasów:

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

jest traktowany jako

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

Zaawansowane książki o programowaniu JavaScript ostrzegają przed nieoczekiwanymi skutkami automatycznego odliczania końca instrukcji i zalecają pisanie średnika na końcu każdej instrukcji, co nie zapobiega niespodziankom, gdy zapomina się o średniku, zwłaszcza gdy kompresja kodu wymaga usunięcia znaków powrotu karetki.

Załączniki

Powiązane artykuły

Linki zewnętrzne

Uwagi i referencje

  1. Douglas Crockford w rozmowie w Yahoo! Crockford o JavaScript - Rozdział 2: I wtedy było JavaScript , ogranicza się do Javy, Scheme i Self jako bezpośredniego wpływu JavaScript
  2. David Flanagan , JavaScript: The Definitive Guide , 6 th  ed. , s.  1

    „JavaScript jest częścią triady technologii, których wszyscy programiści sieci Web muszą się nauczyć: HTML do określania zawartości stron internetowych, CSS do określania prezentacji stron internetowych oraz JavaScript do określania zachowania stron internetowych. "

  3. (w) „  Statystyki użycia JavaScript dla stron internetowych, marzec 2018  ” na w3techs.com (dostęp 3 października 2018 )
  4. (w) „  Wprowadzenie do JavaScript  ” na javascript.info (dostęp 20 lipca 2020 )
  5. „  Modulecounts  ” na www.modulecounts.com (dostęp 5 sierpnia 2017 r. )
  6. (en) http://wiki.commonjs.org/wiki/CommonJS
  7. (w) Node.js Foundation , „  Node.js  ” na Node.js (dostęp 5 sierpnia 2017 )
  8. (w) Liam Tung , „  Deno 1.0: twórcy środowiska uruchomieniowego JavaScript Node.js mają nowy język programowania dla maszynopisu  ” na ZDNet (dostęp 20 lipca 2020 r. )
  9. TechVision: Innowatorzy sieci: Brendan Eich i JavaScript
  10. (w) NETSCAPE I SUN OGŁASZAJĄ JAVASCRIPT, OTWARTY JĘZYK SKRYPOWANIA OBIEKTÓW W WIELU PLATFORMACH DLA SIECI PRZEDSIĘBIORSTW I INTERNETU
  11. "  Jaka jest różnica między Javą a JavaScriptem?" - Quora  ” , na fr.quora.com (dostęp 5 sierpnia 2017 r. )
  12. (w) "  Trademark Document Retrieval & Status  " na tsdr.uspto.gov (dostęp 28 czerwca 2018 )
  13. „Sun Trademarks” (wersja z 28 maja 2010 r. w Internet Archive ) ,28 maja 2010
  14. „  Standard ECMA-262  ” , na stronie www.ecma-international.org (dostęp 2 października 2019 r. )
  15. „  Making JavaScript Safe for Advertising  ” , ADsafe (dostęp 26 maja 2013 r. )
  16. „  Secure ECMA Script (SES)  ” , Code.google.com (dostęp 26 maja 2013 r. )
  17. "  Dlaczego console.log () jest uważany za lepszy niż alert ()?  » , Na stackoverflow.com (dostęp 5 sierpnia 2017 )
  18. (en-US) „  Window  ” , z sieci Mozilla Developer Network (dostęp 5 sierpnia 2017 r. )
  19. (w) "  Obiekty globalne | Dokumentacja Node.js v8.2.1  ” , na nodejs.org (dostęp 5 sierpnia 2017 )
  20. (w) „  IEBlog  ” na msdn.com (dostęp 29 września 2020 r . ) .
  21. Zobacz Wprowadzenie do powłoki JavaScript
  22. (w) Ben Alman , „  Immediately-Invoked Function Expression (IIEF)  ” na benalman.com ,15 listopada 2010(dostęp 14 maja 2016 r. )
  23. (w) Douglas Crockford , „  Konwencje kodu dla języka programowania JavaScript  ” na javascript.crockford.com (dostęp 14 maja 2016 r. )
  24. Ten przykład jest podany na stronie 25 przez: JavaScript - The Definitive Guide , wydanie czwarte, David Flanagan, wydania O'Reilly Media , Sebastopol, Kalifornia.