Warum muss JavaScript mit ";" beginnen?

218

Ich habe kürzlich festgestellt, dass viele JavaScript-Dateien im Web mit einem ;unmittelbar folgenden Kommentarbereich beginnen.

Zum Beispiel ist die jQuery - Plugin Code beginnt mit:

/**
 * 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( $ ){

Warum muss die Datei mit einem beginnen ;? Ich sehe diese Konvention auch in serverseitigen JavaScript-Dateien.

Was sind die Vor- und Nachteile davon?

TK.
quelle

Antworten:

352

Ich würde sagen, da Skripte oft verkettet und minimiert / komprimiert / zusammen gesendet werden, besteht die Möglichkeit, dass der letzte Typ so etwas wie:

return {
   'var':'value'
}

am Ende des letzten Skripts ohne ein ;am Ende. Wenn Sie ;zu Beginn eine haben , ist dies sicher, Beispiel:

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
quelle
8
Sie können tatsächlich keine returnAussage als letztes in einem Skript haben, oder? Die Rückkehr auf höchstem Niveau macht keinen Sinn. Es müsste etwas anderes sein, oder?
user2357112 unterstützt Monica
3
@ user2357112 Noch mehr, Code nach einer returnAnweisung wird nicht ausgeführt, daher ist es nicht sinnvoll, ihn zu verketten. Zumindest }fehlt ein.
Robert
57

Ich glaube (obwohl ich nicht sicher bin, also stürzen Sie sich bitte nicht auf mich), dass dies sicherstellen würde, dass jede vorherige Aussage aus einer anderen Datei geschlossen wird. Im schlimmsten Fall wäre dies eine leere Anweisung, aber im besten Fall könnte vermieden werden, dass versucht wird, einen Fehler in dieser Datei aufzuspüren, wenn die unvollendete Anweisung tatsächlich von oben stammt.

Jerry Bullard
quelle
9
Ich bin mir nicht 100% sicher, aber ich bin in dieser Sache bei dir, Jerry.
Ok,
12

Betrachten Sie dieses Beispiel:

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

Was passieren wird ist, dass es wie folgt bewertet wird:

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

Was auch immer azurückkehrt, wird als eine Funktion behandelt und versucht, initialisiert zu werden.

Dies dient hauptsächlich dazu, Fehler zu vermeiden, wenn versucht wird, mehrere Dateien zu einer Datei zusammenzufassen:

a.js

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

b.js.

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

Wenn wir diese Dateien zusammenfassen, führt dies zu Problemen.

Denken Sie also daran, Ihre ;vor (und vielleicht auch ein paar andere Orte zu stellen. Übrigens. var a = 1;;;var b = 2;;;;;;;;;var c = a+b;ist vollkommen gültiges JavaScript

andlrc
quelle