Почему JavaScript должен начинаться с";"?


недавно я заметил, что многие файлы JavaScript в Интернете начинаются с ; сразу после раздела комментарии.

например, этот плагин jQuery код начинается с:

/**
 * 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 на стороне сервера.

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

3 214

3 ответа:

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

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

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

Рассмотрим пример:

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

что произойдет, так это то, что он будет оцениваться следующим образом:

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

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

это в основном для предотвращения ошибок при попытке объединить несколько файлов в один файл:

а.Яш

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

б.Яш

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

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

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