Чому JavaScript потрібно починати з ";"


218

Нещодавно я помітив, що багато файлів 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 на стороні сервера.

Які переваги та недоліки цього робити?

Відповіді:


352

Я б сказав, оскільки сценарії часто об'єднуються та мінімізуються / стискаються / надсилаються разом, є ймовірність, що останній хлопець мав щось на кшталт:

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 підтримує Моніку

3
@ User2357112 Тим більше, код після того, як в returnзаяві не отримує виконується, так що не має сенсу для конкатенації. Принаймні є }відсутні.
Роберт

57

Я вважаю (хоча я не впевнений, тому, будь ласка, не накидайтесь на мене), що це забезпечить закриття будь-якої попередньої заяви з іншого файлу. У гіршому випадку це буде порожнє висловлювання, але в кращому випадку воно може уникнути спроби відстежити помилку в цьому файлі, коли незавершена заява насправді надходила зверху.


9
Я не впевнений на 100%, але я з вами на цьому, Джеррі.
okw

12

Розглянемо цей приклад:

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

Що станеться, це буде оцінено так:

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

Отже те, що коли-небудь aповертається, буде розглядатися як функція, яку намагалася ініціалізувати.

Це здебільшого для запобігання помилок при спробі скорочення множення файлів в один файл:

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.