Do czego służy średnik wiodący w bibliotekach JavaScript?

W kilku bibliotekach JavaScript widziałem ten zapis na samym początku:

/**
 * Library XYZ
 */
;(function () {
  // ... and so on

Podczas gdy jestem całkowicie zadowolony ze składni "natychmiast wykonanej funkcji"

(function(){...})()
Zastanawiałem się, do czego służy średnik wiodący. Jedyne co mogłem wymyślić to to, że to jest ubezpieczenie. Oznacza to, że jeśli Biblioteka jest osadzona w innym, błędnym kodzie, służy jako" ostatnia Instrukcja kończy się tu najpóźniej " rodzaj ograniczenia prędkości.

Czy ma jakieś inne funkcjonalność?

Author: Peter Mortensen, 2009-12-09

6 answers

Pozwala bezpiecznie połączyć kilka plików JavaScript w jeden, aby szybciej obsługiwać je jako jedno żądanie HTTP.

 141
Author: Kornel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-11-07 11:22:30

NAJLEPSZA odpowiedź została rzeczywiście podana w pytaniu, więc napiszę to tutaj dla jasności:

Początek ; przed wywołanymi bezpośrednio wyrażeniami funkcji służy do zapobiegania błędom podczas dodawania pliku podczas łączenia do pliku zawierającego wyrażenie, które nie jest poprawnie zakończone ;.

Najlepszą praktyką jest zakończenie wyrażeń średnikami, ale także użycie średnika wiodącego jako zabezpieczenia.

 30
Author: holographic-principle,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-11 04:26:49

Ogólnie rzecz biorąc, jeśli wyrażenie zaczyna się od (, [,/,+, lub -, istnieje szansa, że może być interpretowane jako kontynuacja wcześniejszego stwierdzenia. Wypowiedzi zaczynające się na/, + , i - są dość rzadkie w praktyce, ale wypowiedzi zaczynające się od (i [ nie są rzadkością w ogóle, przynajmniej w niektórych stylach programowania JavaScript. Niektórzy programiści jak umieścić średnik obronny na początku każdego takiego stwierdzenia, tak aby kontynuuj pracę poprawnie nawet jeśli instrukcja przed jej modyfikacją i wcześniej usunięto średnik końcowy:

var x = 0 // Semicolon omitted here
;[x,x+1,x+2].forEach(console.log) // Defensive ; keeps this statement separate

Źródło:

JavaScript: the Definitive Guide, 6th edition

 26
Author: Faraz Kelhini,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-11-07 11:26:11

jest to określane jako średnik wiodący.

Jego głównym celem jest ochrona przed nieprawidłowo zamkniętym kodem poprzedzającym, co może powodować problemy. Średnik zapobiegnie temu. Jeśli poprzedni kod został nieprawidłowo zamknięty, nasz średnik to poprawi. Jeśli był prawidłowo zamknięty, nasz średnik będzie nieszkodliwy i nie będzie żadnych skutków ubocznych.

 9
Author: bvmCoder,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-07 00:40:48

Jednolinijkową odpowiedzią jest bezpieczne łączenie wielu plików JavaScript. Użycie średnika nie powoduje problemu.

Załóżmy, że masz wiele funkcji:

IIFE 1

(function(){
  // The rest of the code
})(); // Note it is an IIFE

IIFE 2

(function(){
   // The rest of the code
})(); // Note it is also an IIFE

Na konkatenacji może wyglądać tak:

(function(){})()(function(){})()

Ale jeśli dodasz średnik przed funkcją będzie to wyglądało tak:

;(function(){})();(function(){})()

Więc dodając ;, dba o to, czy jakiekolwiek wyrażenie nie jest poprawnie / align = "left" /

Przykład 2

Załóżmy, że masz plik JavaScript ze zmienną:

var someVar = "myVar"

Kolejny plik JavaScript z jakąś funkcją:

(function(){})()

Teraz na konkatenacji będzie to wyglądało

var someVar = "myVar"(function(){})() // It may give rise to an error

Z dwukropkiem będzie wyglądać tak:

var someVar = "myVar";(function(){})()
 7
Author: brk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-11-07 11:37:14

Dobrze jest, gdy minifikujesz kod JavaScript. Zapobiega to nieoczekiwanym błędom składniowym.

 4
Author: YOU,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-11-07 11:23:29