2010-03-20 2 views
213

Я недавно заметил, что многие файлы JavaScript в Интернете начинаются с ;, следующих за комментарием.Почему JavaScript должен начинаться с ";"?

Например, this jQuery plugin's код начинается с:

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

Почему нужно файл, чтобы начать с ;? Я вижу это соглашение в файлах JavaScript на стороне сервера.

Каковы преимущества и недостатки этого?

ответ

347

Я бы сказал, поскольку сценарии часто сцепляются и уменьшенная/сжатый/отправляемые вместе есть шанс последний парень что-то вроде:

return { 
    'var':'value' 
} 

в конце последнего сценария без ; на конце. Если у вас есть ; на старте на вашей, это безопасно, например:

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 
+8

На самом деле вы не можете иметь оператор 'return' в качестве последней вещи в скрипте, не так ли? Возвращение на верхнем уровне не имеет смысла. Это должно быть что-то еще, не так ли? – user2357112

+2

@ user2357112 Тем более, код * после того, как * оператор 'return' не выполняется, поэтому нет смысла конкатенации. По крайней мере, '' '' отсутствует. – Robert

56

Я верю (хотя я не уверен, поэтому, пожалуйста, не набрасывайся на меня), что это обеспечит закрытие любого предыдущего утверждения из другого файла. В худшем случае это будет пустой оператор, но в лучшем случае он мог бы избежать попытки обнаружить ошибку в этом файле, когда незавершенный оператор действительно появился сверху.

+8

Я не уверен на 100%, но я с вами на этом, Джерри. –

12

Рассмотрим следующий пример:

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

Что будет происходить в что он будет оцениваться следующим образом:

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

То, что возвращается a, будет рассматриваться как функция, которую пытались инициализировать.

Это главным образом для предотвращения ошибок при попытке Concat умножения файлов в один файл:

a.js

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

b.js

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

Если мы объедините эти файлы вместе, это вызовет проблемы.

Итак, не забудьте поставить ; перед ( и, возможно, еще несколько других мест. Btw. var a = 1;;;var b = 2;;;;;;;;;var c = a+b; совершенно справедливо JavaScript