Нужно ли ставить ; в JS?
JS работает и без ; в конце строки и лично мне удобнее их вовсе не ставить, но есть подозрения, что многие оптимизаторы кода заглохнут из-за этого. Опасения оправданы?
Ну и в дополнение, какой оптимизатор посоветуете? Есть ли он онлайн? |
Цитата:
Ставьте точки с запятой только после тех строк, что не оканчиваются на фигурную закрывающую скобку. Посоветую Google Closure Compiler. |
Цитата:
А полезная она в первую очередь в плане читаемости и поддерживаемости кода другими программистами. Именно поэтому все крупные проекты на JS написаны именно с точкой с запятой. Некоторые проекты обычно идут дальше, и валидируют свой код через JSHINT/JSLINT, что позволяет вычистить код от потенциальных ляпов, и неоднозначных моментов, вплоть стандарта форматирования кода |
Не поверите, но навыки форматирования кода я перенял из twitter bootstrap, хотя там JSHINT тоже используется...
|
Цитата:
|
> многие оптимизаторы кода заглохнут из-за этого. Опасения оправданы?
нет. а вообще - взял бы и проверил. > А так же интерприиатор тратит время на авторасстановку. не знаю как интерприиаторы, а интерпретаторы ничем таким не занимаются. > (function(){ /*код*/ })() void function(){ /*код*/ }() > А полезная она в первую очередь в плане читаемости и поддерживаемости кода другими программистами. никакой особой читаемости оно не добавляет. только лишняя пунктуация. |
Цитата:
есть левосторонние и правосторонние выражения. чтоб правильно обработать строку нужно знать где она заканчивается. Интерпретатор разделяет строки при условии что не может продолжить . -вывод, значит время тратит ,однозначно ,на обработку неявных окончаний |
яваскрипт интерпретируется не построчно, а сначала разбивается на лексемы лексером, потом парсером создаётся иерархическое дерево, и оно уже "интерпретируется". парсер - это конечный автомат, который последовательно анализирует лексемы и на основе их типа - помещает её в ту или иную часть дерева. лексема ";" точно также завершает текущее выражение как и например лексема "var", так что вывод - парсер тратит дополнительное время на обработку лишней лексемы ";". но всё это такие мелочи..
http://habrahabr.ru/post/136860/ |
У меня в пятницу как раз была проблема из-за того, что забыл поставить ; после функции. В результате посли сжатия получилось что-то вроде этого:
... = function (){ ... }(function(){ ... }) Причем проблема была в том, что это не вызывало никаких ошибок, просто пропала часть функционала:) |
> У меня в пятницу как раз была проблема из-за того, что забыл поставить ;
нет, проблема была в том, что ты начал выражение со скобки. не начинай выражения со скобок и не будет у тебя больше никогда таких проблем. |
tenshi,
механизм не важен -интерпретатор здесь абстракция. ключевое - Цитата:
Цитата:
Цитата:
|
Shitbox2,
Вот отличная статья на эту тему на хабре, все узкие моменты разбираются. И ответ на ваш вопрос: "На практике надо ставить везде, ибо все так или иначе сжимают скрипты. И отсутствие точки с запятой может вызвать ошибку в сжатом скрипте, которую крайне сложно найти. " |
> против чего ты возражал
и где ты узрел в моих словах автоподстановку, если в синтаксическое дерево лексема ";" даже не попадает? > И ответ на ваш вопрос: это из комментария, а статья о противоположном. и на практике надо выбирать толковые инструменты, а не подстраиваться под кривые. > И всё же спасенные микросекунды не стоят того, чтобы отказываться от явного разделения конструкций. переводы строк вполне себе явные и более естественные разделители. попробуй поработать, например, с питоном и поймёшь, что семиколоны - не более чем атавизм |
Цитата:
;(function(){ ... })()Тогда ; придется ставить лишь в исключительных ситуациях, а не после каждой строки? Hoshinokoe, спасибо за статью, читаю... |
лучше всё же такой
Цитата:
|
А почему он должен работать? Т.е., если записать
string function(){ return 'str' }()то ф-я выполнится? Что-то не нашел такого в синтаксисе... Из статьи Цитата:
P.S. По своему опыту знаю, что пропуск точек с запятой мешает автоформатированию в jsfiddle и т.п. средах, что немного угнетает... |
нет такого синтаксиса. просто есть оператор void.
|
Цитата:
|
какая прелесть)
|
> Не вижу ни одной веской причины, почему это обязательно необходимо предпочесть этому
меньше нагромождение скобочек, например > Твоя неприязнь к семиколонам это всего-лишь вопрос твоих личных предпочтений, и не более того. как и твоя приязнь. о чём спор? > new function(){ /*код*/ } тут создаётся лишний объект |
> пруф или сам знаешь кто
я тебе рассказал как работают парсеры. не веришь - открой исходники и посмотри. > var q = 1 var w = 11 я не стал усложнять описание рассказом про контексты. перевод строки меняет контекст на "продолжение выражения с новой строки". и только в этом контексте лексема "var" завершает предыдущее выражение и начинает новое. в контексте "незавершённое выражение" она кидает исключение. а семиколон - это просто ничего не делающий оператор, а никакой не "разделитель выражений" if( false ) ; else alert(1) if( false ) {} else alert(1) |
Цитата:
|
Цитата:
Вот 2 кода, первый без ";", а второй с ";". Первый не читаемый и не рабочий. Второй читаем и работает. function A(){ this.method1 = function(){alert('ok')} } var a=new A (function(){alert('ok')})() function A(){ this.method1 = function(){alert('ok');} } var a=new A; (function(){alert('ok')})(); Притом первый код я разбил на строки, а так, это был реальный кусок кода, который был вытянут в строку после сжатия какой то программой оптимизации. |
> точки с запятой - это как бриться по утрам, приводиться себя в порядок. Побрился, вышел на улицу и тебе все деФченки улыбаются А не побрился..., фу таким быть
ну так и побрей свой код от этой щетины ;;;; > покажи ка замеры тестирования скорости а у самого ручки отсохли? http://jsperf.com/semicolons > ответь ка из каких токенов состоит лексема декларации функции, просто я вижу ты разбираешься, а я вот все понять этот момент ни как не могу) не поможешь братишка)? читай. вникай. развивайся. > А вот тут ты нам наглядно продемонстрировал что это не просто ни чего не делающий оператор, а именно разделитель выражений в таком случае {} - тоже всего-лишь разделитель выражений |
Цитата:
|
Цитата:
Код был не мой, и сжимал его программой не я (даже не знаю чем вообще его сжимали). Просто будучи фрилансером, однажды разбирал чужой код. Для клиента была тайна, покрытая мраком, почем после оптимизации рабочий код, переставал работать. А автор кода "канул в лету". Оказалась как раз дело в ";". Хотя, tenshi, лучше не ставьте ";", честное слово, мне больше денег будет . :) |
лучше бы посоветовал этому клиенту взять менее кривую программу оптимизации, а не занимался вставкой костылей в виде семиколонов. впрочем, тебе конечно выгодней периодически за деньги расставлять семиколоны, чем решить проблему раз и навсегда.
|
Часовой пояс GMT +3, время: 04:57. |