Почему JavaScript должен начинаться с “;”?
-
21-09-2019 - |
Вопрос
Недавно я заметил, что многие файлы 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 на стороне сервера.
Каковы преимущества и недостатки этого?
Решение
Я бы сказал, поскольку скрипты часто объединяются и минимизируются / сжимаются / отправляются вместе, есть шанс, что у последнего парня было что-то вроде:
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
возвращаемая is будет обрабатываться как функция, которую пытались инициализировать.
В основном это делается для предотвращения ошибок при попытке объединить несколько файлов в один файл:
a.js
function a() {
/* this is my function a */
}
a()
b.js
(function() {
/* This is my closure */
})()
Если мы объединим эти файлы вместе, это вызовет проблемы.
Поэтому не забудьте поместить свой ;
перед (
и, возможно, также в нескольких других местах.Кстати. var a = 1;;;var b = 2;;;;;;;;;var c = a+b;
является совершенно допустимым JavaScript