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 funkcje są obiektami 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 .
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.
Następnie Netscape przesyła JavaScript do Ecma International w celu standaryzacji.
Wersja 1: Narodziny standardu ECMA-262Praca 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 16262Zmiany 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ęzyka3 p wydanie standardu ECMA-262 wprowadzono:
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 etapKonsekwentne 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 funkcje5 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 internetowych7 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.
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ń:
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.
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.
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.
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).
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.
AjaksAjax (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 .
JSONJSON ( 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ć:
Prawidłowy JSON nie może zawierać komentarzy. W Internecie dostępne są walidatory JSON.
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 mediaActionScript , 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 .
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 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:
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 0W 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 0Zmienne 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 manquanteDodatkowo 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;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 deleteZmienna zainicjowana bez deklaracji jest traktowana jako zmienna globalna:
function maFonction() { maVariable = 5; } maFonction(); alert(maVariable); // affiche 5Funkcje 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.
Ś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 4Do 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:
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:
W kontekstach, w których oczekiwane jest wyrażenie, nie jest konieczne używanie pogrubionych nawiasów:
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 9Te 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 5Każ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 5W 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.
„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. "