MySQL Java JavaScript PHP Python HTML-CSS C-sharp C++ Go

Articole suplimentare

Dacă pe o pagină web sunt conectate multe scripturi, poate apărea problema conflictului de nume, dacă diferite scripturi definesc variabile/constante și funcții cu același nume. În unele limbaje de programare, funcționalitatea poate fi grupată în blocuri separate - "spații de nume" (cum ar fi în C#) sau pachete (cum în Java). Diferite pachete/spații de nume pot defini variabile și funcții cu aceleași nume, dar nu va exista conflict de nume.

Totuși, în JavaScript nu există nici pachete, nici spații de nume, dar există posibilitatea de a emula spațiile de nume cu ajutorul unei tehnici speciale, care este numită și modelul "spațiu de nume".

Ideea acestui model constă în a uni variabile/constante/funcții asociate într-un singur obiect, care servește ca un simplu container. Pentru a accesa variabilele și funcțiile din interiorul unui astfel de container se folosește numele acestuia. Atâta timp cât astfel de obiecte-containere au un nume global unic, această abordare nu duce la niciun conflict de nume.

Ca un efect suplimentar, acest lucru permite degrevarea spațiului global de vizibilitate, eliminând din el definițiile variabilelor și metodelor globale.

De exemplu, să examinăm următorul cod:

// definim obiectul-spațiu de nume
var MathLib = MathLib || {};
// definim o variabilă în interiorul spațiului de nume
MathLib.MAX = 1234;
// definim o funcție în interiorul spațiului de nume
MathLib.sum = function(a, b) {  return a + b;};

console.log(MathLib.sum(4, 5)); // 9
console.log(MathLib.MAX); // 1234
MathLib.MAX = 5678;
console.log(MathLib.MAX); // 5678

Aici se definește spațiul de nume sub forma unui obiect MathLib (condiționat vorbind spațiul de nume MathLib). Atenție la forma de definire:

var MathLib = MathLib || {}

Acest model previne rescrierea obiectului MathLib, dacă acesta deja există. Dar cu această definiție nu putem folosi cuvintele cheie let sau const pentru a defini obiectul. Prin urmare, în acest caz, obiectul este definit cu ajutorul var.

Apoi, în MathLib pentru demonstrație sunt definite variabila MAX și funcția sum, pe care le putem utiliza, aplicând numele obiectului MathLib.

Putem defini imediat conținutul spațiului de nume:

var MathLib = MathLib || {
   MAX: 1234,
   sum: function(a, b) {  return a + b;}
};

Astfel, putem defini variabile și funcții cu aceleași nume în interiorul diferitelor obiecte-spații de nume, și nu vom avea un conflict de nume:

var MathLib = MathLib || {
   sum: function(a, b) {  return a + b;}
};
var OtherMathLib = OtherMathLib || {
   sum: function(nums) {  
       let result = 0;
       for(n of nums) result += n;
       return result;
   }
};
console.log(MathLib.sum(4, 5)); // 9
console.log(OtherMathLib.sum([4, 5, 6])); // 15

În acest caz, două obiecte-spațiu de nume definesc funcția cu același nume sum, dar cu funcțional diferit. Dar deoarece pentru accesarea funcției se folosește numele obiectului, nu va exista conflict de nume.

În mod similar, pot fi definite spații de nume încastrate:


var Messages = Messages || {
   ro: {
     

hello: "Salut",
       bye: "Pa"
   },
   en: {
       hello: "Hello",
       bye: "Good bye"
   },
};
console.log(Messages.ru.hello); // Salut
console.log(Messages.en.hello); // Hello