Dlaczego JavaScript musi zaczynać się od „;”?

218

Ostatnio zauważyłem, że wiele plików JavaScript w Internecie zaczyna się ;od natychmiastowego śledzenia sekcji komentarzy.

Na przykład kod tej wtyczki jQuery zaczyna się od:

/**
 * jQuery.ScrollTo
 * Copyright (c) 2007-2008 Ariel Flesler - aflesler(at)gmail(dot)com | http://flesler.blogspot.com
 * Dual licensed under MIT and GPL.
 * Date: 9/11/2008                                      
 .... skipping several lines for brevity...
 *
 * @desc Scroll on both axes, to different values
 * @example $('div').scrollTo( { top: 300, left:'+=200' }, { axis:'xy', offset:-20 } );
 */
;(function( $ ){

Dlaczego plik musi zaczynać się od ;? Widzę tę konwencję także w plikach JavaScript po stronie serwera.

Jakie są zalety i wady robienia tego?

TK.
źródło

Odpowiedzi:

352

Powiedziałbym, że skrypty są często łączone i minimalizowane / kompresowane / wysyłane razem, więc istnieje szansa, że ​​ostatni facet miał coś takiego:

return {
   'var':'value'
}

na końcu ostatniego skryptu bez znaku ;końca. Jeśli masz ;na starcie swój, jest to bezpieczne, na przykład:

return {
   'var':'value'
}
;(function( $ ){ //Safe (still, screw you, last guy!)

return {
   'var':'value'
}
(function( $ ){ //Oh crap, closure open, kaboom!

return {
   'var':'value'
};
;(function( $ ){ //Extra ;, still safe, no harm
Nick Craver
źródło
8
Naprawdę nie możesz mieć returnoświadczenia jako ostatniej rzeczy w skrypcie, prawda? Powrót na najwyższy poziom nie ma sensu. To musiałoby być coś innego, prawda?
user2357112 obsługuje Monikę
3
@ user2357112 Tym bardziej, kod po na returnrachunku nie zostanie wykonany, a więc nie ma sensu do łączenia. Przynajmniej }brakuje.
Robert
57

Wierzę (choć nie jestem pewien, więc proszę nie rzucaj się na mnie), że zapewni to zamknięcie wcześniejszych oświadczeń z innego pliku. W najgorszym przypadku byłaby to pusta instrukcja, ale w najlepszym przypadku mogłaby uniknąć próby wyśledzenia błędu w tym pliku, gdy niedokończona instrukcja faktycznie pochodzi z góry.

Jerry Bullard
źródło
9
Nie jestem w 100% pewien, ale jestem przy tobie, Jerry.
okw
12

Rozważ ten przykład:

function a() {
  /* this is my function a */
}
a()
(function() {
  /* This is my closure */
})()

Stanie się tak, że zostanie to ocenione w następujący sposób:

function a() {
  /* this is my function a */
}
a()(function() {})()

To, co kiedykolwiek apowróci, będzie traktowane jako funkcja, którą próbujemy zainicjować.

Ma to głównie na celu zapobieganie błędom podczas łączenia wielu plików w jeden plik:

a.js

function a() {
  /* this is my function a */
}
a()

b.js

(function() {
  /* This is my closure */
})()

Jeśli połączymy te pliki razem, spowoduje to problemy.

Dlatego pamiętaj, aby umieścić swoje ;przed, (a może także kilka innych miejsc. Btw. var a = 1;;;var b = 2;;;;;;;;;var c = a+b;jest całkowicie poprawnym JavaScript

andlrc
źródło