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