2009-12-09 6 views
133

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

/** 
* Library XYZ 
*/ 
;(function() { 
    // ... and so on 

Хотя я вполне комфортно с «немедленно выполненной функцией» синтаксис

(function(){...})() 

мне было интересно, что ведущая точка с запятой для. Все, что я мог придумать, это страхование. То есть, если библиотека встроена в другой, багги-код, она служит как «последний оператор заканчивается здесь, по крайней мере, последним» типом скорости.

Есть ли у него какие-либо другие функции?

+6

Думаю, у вас уже есть правильный ответ - в мире много ошибок, поэтому страхование важно. – kdgregory

ответ

120

Это позволяет безопасно объединять несколько JS-файлов в один, чтобы быстрее обслуживать его как один HTTP-запрос.

+12

Но это было бы необязательно, если бы все файлы были правильно закодированы, не так ли? – Boldewyn

+5

Нет. В вашем примере вы получите '(function() {...})() (function() {...})()'. –

+6

Что я имел в виду «правильно закодировано», что каждая библиотека заканчивается правильным количеством конечных точек с запятой ... – Boldewyn

4

Его хорошо, когда вы уменьшаете коды js. Предотвратите непредвиденные ошибки синтаксиса.

+0

Нравится что? Имеет ли точка с запятой какое-либо значение для следующего кода или это просто для гипотетического багги-кода, объединенного перед реальной библиотекой? – Boldewyn

+0

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

+1

Но, конечно же, ответственность за это верно в том, что мини-блок отвечает за это. Являются ли багги-министры нормой в наши дни? –

24

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

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

Лучшая практика заключается в том, чтобы прервать ваши выражения точкой с запятой, но также использовать ведущую точку с запятой в качестве защиты.

+0

Зачем также прекращать выражения с точкой с запятой, если вы используете оборонительные точки с запятой? Либо вы можете полагаться на точку с запятой, находящуюся в конце каждой строки, либо использовать оборонительные точки с запятой. Выполнение обоих заставляет людей ошибочно заключать, что есть причина для обоих. Совет по использованию оборонительных точек с запятой хорош; совет также заменить каждый экземпляр '' \ n "' на '"; \ n "' не имеет смысла. –

+2

@VladimirKornea: потому что вы не всегда используете только свои собственные библиотеки :) – jvenema

+0

@jvenema Я не знаю, почему вы думаете, что имеет значение. –

20

В общем случае, если заявление начинается с ([, /, + или -., Есть шанс, что это может быть интерпретированы как продолжение заявления до заявления, начиная с /, +, и - довольно редки на практике, но утверждения, начинающиеся с (и [не являются редкостью вообще, по крайней мере в некоторых стилях программирования JavaScript. Некоторые программисты, например , ставят оборонительную точку с запятой в начале любого такого утверждения, он будет продолжать работать правильно, даже если инструкция до его изменения и ранее удаленная точка с запятой удалена:

var x = 0 // Semicolon omitted here 
;[x,x+1,x+2].forEach(console.log) // Defensive ; keeps this statement separate 

Источник:

Javascript the Definitive Guide 6th edition

6

Это называется ведущей точкой с запятой.

Его основная цель - защитить себя от предыдущего кода, который был неправильно закрыт, что может вызвать проблемы. Точка с запятой предотвратит это. Если предыдущий код был неправильно закрыт, наша точка с запятой исправит это. Если бы он был правильно закрыт, наша точка с запятой будет безвредной, и побочных эффектов не будет.