Javascript | ||
Data primei versiuni | Mai 1996 | |
---|---|---|
Paradigmă | Multi-paradigme : script , orientat spre obiect ( orientat spre prototip ), imperativ , funcțional | |
Autor | Brendan Eich | |
Dezvoltatori | Netscape Communications Corporation , Fundația Mozilla | |
Ultima versiune | 11 - ES2020 (iunie 2020) | |
Tastare | dinamic , slab | |
Standarde | ECMA-262 ISO / IEC 16262 |
|
Dialecte | JavaScript, JScript , ECMAScript | |
Influențată de | Self , Scheme , Perl , C , C ++ , Java , Python | |
Influențat | JScript , JScript .NET , Objective-J , TIScript | |
Implementări | SpiderMonkey , Rhino , KJS , JavaScriptCore , V8 | |
Site-ul web | Mozilla | |
Extensie de fișier | js | |
JavaScript este un limbaj de programare al scripturilor utilizate în principal în paginile web interactive și ca atare este o parte esențială a aplicațiilor web . Împreună cu tehnologiile HTML și CSS , JavaScript este uneori considerat una dintre tehnologiile de bază ale World Wide Web . O mare majoritate a site-urilor web îl folosesc, iar majoritatea browserelor web au un motor JavaScript dedicat pentru interpretarea acestuia , indiferent de considerațiile de securitate care pot apărea dacă este necesar.
Este un object- la- prototip orientat limbaj : bazele limbajului și principalele sale interfețe sunt furnizate de obiecte .
Cu toate acestea, spre deosebire de un limbaj orientat pe obiecte, obiectele de bază nu sunt instanțe de clase .
Fiecare obiect de bază (de exemplu, documentul sau obiectul Windows) are propriul model care îi va permite să instanțieze obiecte copil folosind constructori folosind proprietățile sale. De exemplu, proprietatea de prototipare le va permite să creeze obiecte moștenitoare personalizate.
În plus, funcțiile sunt obiecte de primă clasă . Limbajul susține obiectul , paradigma imperativă și funcțională . JavaScript este limba cu cel mai mare ecosistem datorită managerului său de dependență npm , cu aproximativ 500.000 de pachete înaugust 2017.
JavaScript a fost creat în 1995 de Brendan Eich . A fost standardizat sub numele ECMAScript înIunie 1997de către Ecma International în standardul ECMA-262. Versiunea valabilă în prezent a acestui standard, din iunie 2020, este a 11-a ediție.
JavaScript este o implementare a ECMAScript, cea implementată de Fundația Mozilla . Implementarea de către Microsoft a ECMAScript (în Internet Explorer până la versiunea 9) se numește JScript , în timp ce implementarea Adobe Systems se numește ActionScript .
JavaScript este, de asemenea, utilizat pentru servere cu utilizarea (de exemplu) a Node.js sau Deno .
Limbajul a fost creat în zece zile în mai 1995 în numele Netscape Communications Corporation de către Brendan Eich , care a fost inspirat de multe limbi, în special Java, dar simplificând sintaxa pentru începători. Brendan Eich a dezvoltat inițial un limbaj de scriptare pe partea serverului numit LiveScript pentru a consolida oferta comercială a serverului HTTP pentru Mosaic Communications Corporation . Lansarea LiveScript a venit într-un moment în care NCSA a forțat Mosaic Communications Corporation să-și schimbe numele în Netscape Communications Corporation. Netscape lucra atunci la dezvoltarea unei versiuni orientate către client a LiveScript. Cu câteva zile înainte de lansare, Netscape schimbă numele LiveScript în JavaScript. Sun Microsystems și Netscape au fost parteneri și mașina virtuală Java din ce în ce mai populară. Această schimbare de nume a servit interesele ambelor companii.
În Decembrie 1995, Sun și Netscape anunță lansarea JavaScript. ÎnMartie 1996, Netscape implementează motorul JavaScript în browserul său web Netscape Navigator 2.0. Succesul acestui browser contribuie la adoptarea rapidă a JavaScript-ului în dezvoltarea web orientată spre client. Microsoft reacționează apoi dezvoltând JScript , pe care îl include apoi în Internet Explorer 3.0 de cătreaugust 1996 pentru ieșirea din browser.
JavaScript este descris ca un supliment la Java într-un comunicat de presă comun de la Netscape și Sun Microsystems , datat4 decembrie 1995. Această inițiativă a contribuit la crearea unei anumite confuzii în rândul publicului între cele două limbi, care sunt sintactic similare, dar deloc în conceptele lor fundamentale și care continuă până în prezent.
"JavaScript" devine o marcă comercială înregistrată de Oracle în Statele Unite înMai 1997.
Netscape trimite apoi JavaScript la Ecma International pentru standardizare.
Versiunea 1: Nașterea standardului ECMA-262Munca începe în Noiembrie 1996 și se termină în Iunie 1997, Dând naștere la 1 st ediție a standardului ECMA-262 care specifică limba ECMAScript . Standardul este apoi transmis ISO / IEC și publicat înAprilie 1998 ca standard internațional ISO / IEC 16262.
Versiunea 2: Omogenizare cu standardul ISO / IEC 16262Modificări editoriale sunt făcute la standardul ECMA-262 pentru a se conforma cu standardul internațional ISO / IEC 16262, rezultând în 2 doua ediție a standardului ECMA-262 înIunie 1998.
Versiunea 3: Îmbunătățiri și constituirea limbajului3 - a ediție a standardului ECMA-262 introdus:
Este publicat de Ecma International în Decembrie 1999 trimis apoi la ISO / IEC care publică standardul internațional ISO / IEC 16262: 2002 în Iunie 2002. După publicarea 3 - lea ediție urmează adoptarea masivă de către toate browserele web.
Versiunea 4: Etapa neterminatăO lucrare consistentă este întreprinsă pentru a dezvolta 4 - a ediție a standardului ECMA-262, dar nu va fi finalizată în acest an și nu vor vedea niciodată ziua. Cu toate acestea, o parte din dezvoltarea realizată va fi încorporată în ediția a 6- a .
Versiunea 5: Dezambiguizare și funcții noi5 - a ediție a ECMA-standard , clarifică 262 ambiguitățile 3 - lea ediție și introduce getteri, introspecția, atribute de control, funcții suplimentare tabele de manipulare, acceptă formatul JSON și modul strict pentru verificarea erorilor. Este publicat de Ecma International îndecembrie 2009 apoi trimis la ISO / IEC, care face corecții minore și publică standardul internațional ISO / IEC 16262: 2011 în iunie 2011. Ediția 5.1 a standardului ECMA-262, identic cu textul standardului internațional ISO / IEC 16262: 2011, a fost publicată la aceeași dată.
Versiunea 6: Suport și funcționalitate îmbunătățiteDeși dezvoltarea celei de-a 6- a ediții a standardului ECMA-262 a început oficial în 2009, cu puțin înainte de publicarea celei de-a 5- a ediții, a fost publicată îniunie 2015este de fapt punctul culminant al 15 ani de muncă de la publicarea 3 - lea ediție în 1999. Scopul acestei 6 - lea ediție este de a oferi un sprijin mai bun pentru aplicații pe scară largă, crearea de biblioteci și utilizarea ECMAScript ca o compilație țintă pentru alte limbi. Această ediție introduce în special module, clase, domeniu lexical la nivel de bloc, iteratoare și generatoare, promisiuni pentru programare asincronă, modele de destructurare, optimizarea apelurilor de terminal, noi structuri de date (matrici asociative, seturi, matrici binare), suport pentru caractere Unicode suplimentare în șiruri și expresii regulate și capacitatea de a extinde structurile de date predefinite.
De la versiunea 7 până în prezent: adaptare permanentă la instrumentele webA 7- a ediție a ediției standard ECMA-262 este primul număr al noului proces de dezvoltare deschisă și publicarea anuală a ritmului adoptată de comitetul Ecma TC39. Un document text este creat din ediția a 6- a și este postat pe GitHub ca bază de dezvoltare pentru această nouă ediție. După corectarea a mii de bug-uri și erori editoriale, precum și introducerea operatorului de exponențiere și o nouă metodă pentru plăci prototip, ediția a 7- a este publicată îniunie 2016.
Ediția actuală a standardului ECMA-262 este a 11-a ediție lansată în iunie 2020.
JavaScript și structura DOM a paginilor HTML / XML au unele vulnerabilități de securitate. Acest lucru se datorează faptului că scripturile rău intenționate se pot ascunde în codul unei pagini web și se pot executa pe computerul țintă al utilizatorului web.
Furnizorii de browsere web încearcă să reducă acest risc cu două restricții:
Vulnerabilitățile JavaScript sunt adesea încălcări ale cel puțin unuia dintre aceste două principii.
Anumite subseturi ale limbajului JavaScript, cum ar fi JavaScript - ADsafe sau Secure ECMAScript (SES) oferă niveluri mai mari de securitate, în special pentru scripturile create de terți (în special reclame). Caja este un alt software pentru încorporarea și izolarea în siguranță a JavaScript și HTML de la terți.
Politica de securitate a conținutului este metoda principală pentru a se asigura că numai un script de încredere este executat pe o pagină web. Meltdown este o vulnerabilitate independentă de JavaScript, care poate fi exploatată în special în JavaScript.
Scopul JavaScript este de a manipula cu ușurință obiecte , în sensul computerului, furnizate de o aplicație gazdă. De exemplu, într-un browser web, un script scris în javascript poate fi utilizat pentru a adăuga o atingere interactivă sau dinamică unei aplicații (pagină sau site web), care altfel ar fi o pagină statică înghețată. Limbajul Javascript face posibil, de exemplu, scrierea de scripturi pentru afișarea sau ascunderea unui paragraf, a unei imagini sau a unui popup, în funcție de interacțiunile utilizatorului, sau pentru a informa serverul despre timpul petrecut citind o pagină.
Este posibil într-un script în Javascript, să se afișeze textul Hello World pe consola de depanare a aplicației. Acest lucru poate fi folosit de dezvoltatori în faza de dezvoltare. :
window.console.log('Hello world'); window.console.exp(hello world) // ou global.console.log('Hello world'); window.console.log(hello world)Într-o aplicație gazdă browser, consola este una dintre metodele obiectului fereastră globală . În alte aplicații gazdă precum Node.js , obiectul global este global . Deoarece metodele obiectului global sunt accesibile fără prefix, fereastra și globalul sunt opționale.
Sintaxa
console.log('Hello world');prin urmare, va avea exact același rezultat, pe lângă faptul că este compatibil în toate mediile.
Codul JavaScript are nevoie de un obiect global pentru a atașa declarații ( variabile și funcții) la acesta înainte de a executa instrucțiuni. Cea mai cunoscută situație este cea a obiectului fereastră obținut în contextul unei pagini web. Sunt posibile alte medii, inclusiv cel furnizat de Adobe sau mediul Node.js (vezi Alte utilizări mai jos).
Codul JavaScript poate fi integrat direct în paginile web , pentru a fi executat pe stația de lucru client . Apoi, browserul web este cel care se ocupă de executarea acestor programe numite scripturi.
În general, JavaScript este utilizat pentru a controla datele introduse în formularele HTML sau pentru a interacționa cu documentul HTML prin interfața Model de obiect document , furnizată de browser (aceasta este uneori denumită HTML dinamic sau DHTML). De asemenea, este utilizat pentru a crea aplicații dinamice, tranziții, animații sau manipularea datelor reactive, în scopuri ergonomice sau cosmetice.
JavaScript nu se limitează la manipularea documentelor HTML și poate fi, de asemenea, utilizat pentru a manipula SVG , XUL și alte dialecte XML .
IncompatibilitateNetscape și Microsoft (cu JScript în Internet Explorer până la versiunea 9) și-au dezvoltat propria variantă a acestui limbaj care fiecare acceptă aproape pe deplin standardul ECMAScript, dar are caracteristici suplimentare și incompatibile, rareori utilizate în contextul programării paginilor. Cu toate acestea, scripturile JavaScript sunt adesea sursa dificultăților. Acestea se datorează mai des suportului pentru diferite versiuni de modele de obiecte ( DOM ) oferite de browsere, decât problemelor de portabilitate a limbajului (diferitele implementări care respectă standardul ECMAScript relativ bine).
Pentru a verifica dinamic dacă un obiect (în versiunea JavaScript utilizată în timpul interpretării) are într-adevăr o metodă, folosim adesea o construcție precum:
if (monObjet.methode && typeof monObjet.methode === 'function') { monObjet.methode(); }Astfel, verificăm dacă myObjet are într-adevăr o implementare a unei metode pe care o putem folosi apoi. Cel mai adesea, în cazul în care un browser nu acceptă metoda de myObject , susține o metodă comparabilă method2 , și putem adapta apoi codul JavaScript pentru browser - ul pe care - l execută:
if (typeof monObjet.methode === 'function') { monObjet.methode(); } else if (typeof monObjet.methode2 === 'function') { monObjet.methode2(); }O altă metodă este de a verifica, din partea serverului, browserul utilizat de client și de a trimite codul corespunzător. Acest lucru nu este recomandabil, totuși, deoarece este mult mai bine să testați direct existența, comportamentul unei funcții, proprietăți etc. mai degrabă decât să facă prezumții bazate pe detectarea browserului.
AjaxAjax (din engleză Asynchronous JavaScript And XML ) este un set de tehnici care decuplează schimbul de date între browser și serverul web de afișarea unei pagini web, ceea ce face posibilă modificarea conținutului paginilor web fără a le reîncărca. Datorită obiectului JavaScript XMLHTTPRequest , această metodă face posibilă efectuarea de cereri HTTP pe serverul web din browserul web și, de asemenea, procesarea răspunsurilor HTTP de pe serverul web pentru a modifica conținutul paginii web. Răspunsul a fost în general în format XML , care acum tinde să fie înlocuit cu formatul JSON , care are avantajul că este nativ din JavaScript. Scriptul manipulează setul de obiecte DOM care reprezintă conținutul paginii web. Tehnologiile XMLHTTPRequest , XML și DOM au fost adăugate browserelor web între 1995 și 2005. Metoda Ajax face posibilă crearea de aplicații Internet bogate , oferind o mai mare manevrabilitate și confort; este unul dintre subiectele cheie ale mișcării Web 2.0 .
JSONJSON ( JavaScript Object Notation ) este un format care utilizează notația obiectelor JavaScript pentru a transmite informații structurate, într-un mod mai compact și mai aproape de limbaje de programare , decât XML.
În ciuda existenței DOM și a introducerii recente a E4X (vezi mai jos) în specificația limbajului JavaScript, JSON rămâne cel mai simplu mod de a accesa datele, deoarece fiecare flux JSON nu este altceva decât un obiect JavaScript serializat. Mai mult, în ciuda legăturii sale istorice (și tehnice) cu JavaScript, JSON rămâne un format de date structurat și poate fi utilizat cu ușurință de toate limbajele de programare.
Din 2009, browserele au început să integreze suport nativ pentru formatul JSON, care facilitează gestionarea acestuia, securitatea (împotriva evaluării scripturilor rău intenționate incluse într-un șir JSON) și viteza de procesare. Astfel, browserele Firefox și IE îl integrează, respectiv, din versiunile 3.5 și 8.
Exemplu de JSON:
{ "clef1": "valeur", "clef2": 12345, "clef3": true, "clef4": { "clef5": "valeur" } }Structura este organizată după cheie / valori. Cheile trebuie să fie între ghilimele duble. Valorile pot fi:
Un JSON valid nu poate avea comentarii. Există validatori JSON online.
JavaScript poate fi folosit și ca limbaj de programare pe un server HTTP cum ar fi limbaje precum PHP , ASP etc. În plus, proiectul CommonJS funcționează pentru a specifica un ecosistem pentru JavaScript în afara browserului (de exemplu, pe server sau pentru aplicații desktop native). Proiectul a fost început de Kevin Dangoor înianuarie 2009. Proiectul CommonJS nu este afiliat grupului Ecma International TC39 care lucrează la ECMAScript, dar unii membri TC39 sunt implicați în proiect.
Din punct de vedere istoric, JavaScript a fost propus pe serverele Netscape distribuite ulterior de Sun Microsystems sub denumirile iPlanet și Sun ONE , dar JScript poate fi utilizat pe serverele Internet Information Services de la Microsoft . JScript poate fi, de asemenea, utilizat pentru scriptarea unei platforme Microsoft Windows prin Windows Scripting Host (WSH).
Există, de asemenea, proiecte de implementare a serverelor independente și Open Source în JavaScript. Printre acestea, putem distinge Node.js , o platformă versatilă de dezvoltare a aplicațiilor de rețea bazată pe motorul JavaScript V8 și specificațiile CommonJS .
Alte mass-mediaActionScript , utilizat în Adobe Flash , este, de asemenea, o implementare a ECMAScript. Vă permite să gestionați toate elementele animației, considerate ca obiecte. JavaScript poate fi folosit pentru a crea alte aplicații Adobe ( Photoshop , Illustrator etc.), ceea ce face posibilă crearea de scripturi independente de platformă (Microsoft Windows, Apple OSX, Linux etc.).
JavaScript este în cele din urmă utilizat în platforma de dezvoltare Mozilla , pe care se bazează mai multe programe software, cum ar fi browserele web , pentru sarcini legate de interfața cu utilizatorul și comunicarea internă (de exemplu: extensiile Firefox și Thunderbird sunt instalate pe baza fișierelor XPI folosind JavaScript. A se vedea de asemenea, Prefs.js ).
Din 2004, obiectul js al mediului de programare grafică Max / MSP a fost folosit pentru a deschide o fereastră pentru programarea în JavaScript, chiar și în cadrul unui program Max / MSP .
Software- ul ImageJ și CaRMetal sunt echipate cu console JavaScript, care le permit să scrie scripturi într-un context grafic. Algobox folosește JavaScript pentru sintaxa funcțiilor sale. H5P folosește HTML5 și Javascript pentru a facilita crearea de conținut online interactiv.
JavaScript este, de asemenea, utilizat în conținutul BIFS pentru procesarea evenimentelor. Pentru aceasta, specificația BIFS oferă un nod Script pentru a încorpora ECMAScript.
Suita de birou OpenOffice.org vă permite să utilizați JavaScript ca limbaj macro.
JavaScript poate fi folosit și în shell sau cu gadget-uri Vista.
Formatul de grafică vectorială SVG încorporează limbajul ECMAscript pentru a crea grafică interactivă utilizabilă direct într-un browser.
În cele din urmă, JavaScript este, de asemenea, utilizat pentru a stimula QML-ul bibliotecii grafice Qt .
În JavaScript, toate expresiile (identificatori, literali și operatori și operanzii lor) sunt de tip referință (ca în Python și Ruby , dar spre deosebire de C ++ , Java , C # , Swift și OCaml care au și expresii de tip valoare ), să spunem că evaluarea lor nu produce o dată în mod direct, ci o referință la o dată. Referința se numește referentul termenului și i se dă expresia menționată .
În JavaScript, atribuirea unei variabile își modifică referentul, cu alte cuvinte, leagă variabila de alte date: vorbim despre o modificare a legării variabilei (în engleză 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]Domeniul lexical al unei variabile este partea unui program în care legătura dintre identificatorul său și datele sale este validă. În JavaScript, sfera lexicală a unei variabile poate fi de două tipuri, în funcție de cuvântul cheie folosit pentru a o declara:
O variabilă poate fi atribuită sau ascunsă de o funcție copil a funcției (sau a spațiului global) unde este declarată:
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În JavaScript, indiferent de locul în care este declarată o variabilă în sfera sa lexicală, variabila este creată la începutul evaluării sferei sale lexicale.
Variabilele declarate cu cuvântul cheie varsunt, de asemenea, pre-inițializate la valoarea undefinedatunci când sunt create și, prin urmare, accesibile de la începutul domeniului lor lexical. Vorbim despre creșterea variabilei ( variabilă de ridicare în engleză), deoarece se întâmplă ca și cum declarația variabilei ar fi ajuns până la începutul domeniului său lexical:
alert(maVariable); // affiche undefined var maVariable = 0; alert(maVariable); // affiche 0Variabilele declarate cu cuvântul cheie letsau const(ECMAScript 6) nu sunt pre-inițializate și, prin urmare, inaccesibile înainte de declararea lor. Dacă o variabilă declarată cu cuvântul cheie letnu are inițializator, aceasta este inițializată la valoare undefinedîn timpul evaluării declarației, altfel este inițializată cu inițializatorul în timpul evaluării declarației. Dacă o variabilă declarată cu cuvântul cheie constnu are inițializator, se ridică o eroare la evaluarea declarației, în caz contrar se inițializează cu inițializatorul la evaluarea declarației:
// 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În plus, JavaScript permite redeclararea aceleiași variabile în domeniul său lexical, dar numai cu cuvântul cheie var :
var maVariable = 2; var maVariable = 9;În JavaScript, există mai multe moduri de a declara o variabilă globală , iar unele interacționează cu obiectul global (denumit windowîn browsere):
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 deleteO variabilă inițializată fără declarație este tratată ca o variabilă globală:
function maFonction() { maVariable = 5; } maFonction(); alert(maVariable); // affiche 5Funcțiile anonime sunt, așa cum sugerează și numele lor, funcții care nu poartă nume:
setTimeout(function () { alert('Trois secondes se sont écoulées.'); }, 3000);Acesta este dat ca parametru funcției setTimeout, care vă permite să definiți o durată înainte de a afișa mesajul.
Un mediu lexical este setul de variabile valide într-o parte a programului. Este alcătuit din mediul lexical intern (variabile locale) și o referință la mediul lexical extern (variabile nelocale).
O închidere lexicală ( închidere lexicală în engleză) este o funcție a mediului său lexical exterior, adică toate variabilele nelocale care au capturat fie prin valoare (o copie a conservării fiecărui element de date legată de variabile non-locale), fie prin referință (păstrarea unei referințe la fiecare element de date legat de variabile nelocale). La fel ca în JavaScript toate variabilele sunt de tip referință (vezi secțiunea Legarea identificatorului ), JavaScript folosește doar captarea prin referință - care în C ++ 11 corespunde sintaxei [&](…) { … };- și durata de viață a variabilelor nelocale. Capturate de o funcție este extins la durata de viață a funcției - ceea ce nu este cazul în C ++ 11, indiferent de tipul de captură:
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 4Până la ECMAScript 6, JavaScript nu oferea în mod nativ domeniu variabil la nivel de bloc (fără cuvinte cheie letsau const) și nici module . Pentru a evita poluarea spațiului global, o metodă a fost încapsularea codului său într-o funcție pentru a se baza pe domeniul variabilelor care au loc la nivelul funcției în JavaScript, apoi pentru a invoca această funcție imediat după. Pentru a combina cei doi pași (definiția funcției și invocarea) și pentru a nu adăuga un nume de funcție suplimentar în spațiul global, limbajul permite expresiile funcțiilor imediat invocate (EFII; în engleză expressions-function invocate imediat , IIFE).
Sunt posibile mai multe sintaxi pentru acest tip de expresie, cele mai frecvente fiind:
Funcția invocă operator ()la final permite executarea imediată a funcției. Parantezele îngroșate spun analizorului că conțin o expresie, deoarece în JavaScript parantezele nu pot conține o declarație. Altfel, în majoritatea situațiilor, cuvântul cheie functioneste tratat ca o declarație de funcție, nu ca o expresie de funcție. Există alte modalități de a forța o expresie de funcție:
În contextele în care se așteaptă o expresie, nu este necesar să folosiți paranteze îndrăznețe:
O utilizare importantă a expresiilor de funcții invocate imediat este pentru construirea modulelor. Modulele permit atât să colecteze proprietăți și metode într-un spațiu de nume, cât și să facă anumiți membri privați:
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 9Cele Prototipurile sunt obiecte folosite în timpul unei pene de rezolvare de nume. Acest mecanism este un tip de moștenire: moștenirea prototip. În JavaScript, orice obiect are un prototip, accesibil prin intermediul metodei Object.getPrototypeOf(sau prin proprietatea istorică __proto__standardizată în ECMAScript 6 pentru a asigura compatibilitatea între browsere, dar nu este recomandată). În plus, operatorul este newutilizat pentru a transforma invocarea unei funcții de constructor într-un obiect (instanțiere) al cărui prototip este egal cu proprietatea prototypefuncției de constructor:
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 5Orice caz de MonConstructeur( monInstanceaici) are un prototip egal cu MonConstructeur.prototype. Când utilizați o proprietate sau o metodă a unei instanțe a MonConstructeur( monInstance.maPropriete1și monInstance.maPropriete2aici), dacă instanța nu are proprietatea sau metoda căutată, căutarea continuă în prototipul instanței ( MonConstructeur.prototypeaici). Dacă căutarea eșuează și cu acest obiect, căutarea continuă în prototipul acestui obiect și așa mai departe până la atingerea primei funcții de constructor. Dacă căutarea nu reușește, această primă funcție de constructor fiind o funcție și, prin urmare, o instanță a funcției de constructor de Functionlimbaj, căutarea continuă în prototipul său, care este egal cu Function.prototype. Dacă căutarea eșuează din nou, Function.prototypefiind un obiect și, prin urmare, o instanță a funcției constructor de Objectlimbaj, căutarea continuă în prototipul său, care este egal cu Object.prototype. Dacă căutarea nu reușește de data aceasta, deoarece prototipul Object.prototypeegal este null, căutarea se oprește și JavaScript generează o eroare de rezoluție a numelui. Acest mecanism de căutare trece prin ceea ce se numește lanțul prototipurilor .
Codul operatorului instanceOfilustrează bine acest mecanism. A instanceOf B(sau echivalent instanceOf.call(A, B):) returnează truedacă Aeste o instanță a B, adică dacă B.prototypese găsește în lanțul prototip al Ași falsealtfel:
function instanceOf(f) { var o = this; while (o !== null) { if (Object.getPrototypeOf(o) === f.prototype) { return true; } o = Object.getPrototypeOf(o); } return false; }În plus, metoda Object.createintrodusă în ECMAScript 5 face posibilă evitarea utilizării directe a funcțiilor de constructor, a proprietăților acestora prototypeși a operatorului new, pentru a lucra numai cu obiecte. Utilizarea acestei metode simplifică foarte mult complexitatea codului și, prin urmare, este recomandată. Metoda Object.createeste definită de
if (typeof Object.create !== 'function') { Object.create = function (o) { function F() {} F.prototype = o; return new F(); }; }Exemplul anterior poate fi apoi rescris
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În C , fiecare afirmație se termină cu punct și virgulă . Această practică a făcut ca punctul și virgula să fie o cerință în multe limbi inspirate din sintaxa C.
JavaScript este mai flexibil, permițând unui sfârșit de linie să marcheze implicit sfârșitul unei instrucțiuni. Scopul este de a facilita utilizarea limbajului persoanelor fără experiență în programarea computerelor . Dar această flexibilitate introduce efecte neașteptate:
return true;Analizorul înțelege acest lucru ca două instrucțiuni:
return; true;Expresiile funcționale invocate imediat atunci când programatorul se bazează pe finalurile instrucțiunilor implicite întâmpină, de asemenea, acest tip de problemă cu utilizarea parantezelor:
maVariable1 = maVariable2 + maVariable3 (function () { // code })()este tratat ca
maVariable1 = maVariable2 + maVariable3(function () { /* code */ })();Cărțile avansate de programare JavaScript avertizează cu privire la efectele neașteptate ale deducerii automate la sfârșitul instrucțiunii și recomandă scrierea unui punct și virgulă la sfârșitul fiecărei instrucțiuni, ceea ce nu împiedică surprizele atunci când uită punctul și virgula, mai ales atunci când comprimarea codului necesită înlăturarea returnărilor de transport.
„JavaScript face parte din triada de tehnologii pe care trebuie să o învețe toți dezvoltatorii web: HTML pentru a specifica conținutul paginilor web, CSS pentru a specifica prezentarea paginilor web și JavaScript pentru a specifica comportamentul paginilor web. "