Показать сообщение отдельно
  #23 (permalink)  
Старый 13.01.2010, 12:57
Профессор
Отправить личное сообщение для Dmitry A. Soshnikov Посмотреть профиль Найти все сообщения от Dmitry A. Soshnikov
 
Регистрация: 25.02.2008
Сообщений: 707

Сообщение от B~Vladi
Писать нужно как принято и не будет никаких двойственных ситуаций (я про перенос скобки).

iff (!x) {
  x = 1;
}
Верно. Всё разобрали

Только насчёт "как принято" тут утверждать категорично нельзя, поскольку официального style-guide (который я бы хотел видеть даже от ECMA, либо от B.Eich-a) - нет. Более-менее "полуофициальным" можно считать style-guide от Mozilla - https://developer.mozilla.org/en/JavaScript_style_guide (поскольку создатель JS хоть как-то связан с Mozilla, а именно - работает там ); данная стилистика похожа на стиль Java.

К примеру у Python-a заведён специальный документ на эту тему, на официальном сайте.

По поводу приоритетов, я уже писал: JavaScript style guide, JSLint, Strict Warnings

(1) - локальный в компании, (2) - официальный технологии, (3) - локальная привычка. В идеале, (1) должно быть === (2). В профессиональном коде на международном уровне, (3) вообще не должно рассматриваться.

Сообщение от Gvozd
видимо это и есть то к чему нас подводил Дмитрий
хотя не факт
Да, именно это. Но, здесь опять же, интерес был больше академический. Это не значит, что я говорил - "вот хорошее практическое решение для избежания таких проблем", нет; поскольку, стилистика может выбираться разная. В данном конкретном случае - да, это помогло бы.

Сообщение от Gvozd
ибо, такой подход все еще не решает проблему do-while
Да, Опера, почему-то, ставит автоматом точку с запятой после dof со скобкой в той же строке.

var dof = 10;
dof 
{
} while(false);


Вот этот код должен завершится так:

var dof = 10;
dof; // разрешение идентификатора
{ // пустой блок
}; while(false); // пустой while


Но не этот:

var dof = 10;
dof {
} while(false);


Так что, Опера, не права, получается.

Сообщение от B~Vladi
Если моя версия окажется верной, будешь выступать за смену стилистики в вашем проекте (внутри вашей компании)? В любом случае займу твою позицию касаемо стилистики.
В текущий проект я уже пришёл, когда он активно разрабатывался, и там уже была устоявшаяся стилистика.

Вообще, существенным является именно наличие определённой единой стилистики кода в команде - это на данный момент имеется.

Впрочем, если бы речь шла о выборе стилистики в самом начале проекта, я бы отдал предпочтение стилистике Mozilla. Хотя, стилистика текущего проекта также хорошо структурирована и оформлена (для меня вопрос "Где ставить скобку - в той же строке или с новой?" - давно уже перешёл в разряд несущественных, я могу подстраиваться под стилистику, главное, чтобы она была единой, логически структурированной и обоснованной).

Хотя, если "завтра" B.Eich или ECMA выпустят официальный style guide, в этом вопросе будет поставлена окончательная точка - и тогда да, возможно предложить смену стилистики, поскольку код на международном уровне должен быть оформлен по официальному стилю технологии (хотя, локальная стилистика компании всё ещё будет иметь приоритет выше; в своих локальных проектах - должна быть только официальная стилистика, не касаемо каких-то своих локальных привычек).

Kolyaj, возвращаясь по твоим вопросам (ответам),

Сообщение от Kolyaj
Можно, конечо, развернуть тут десяток правил грамматики. Этого ждешь?
Естественно не этого (это было бы занудно и скучно, даже для меня ). Правило там одно:

CallExpression :
    MemberExpression Arguments

Arguments:
    ( )
    ( ArgumentList )


Т.е. MemberExpression со скобками вызова - это выражение вызова (функции). А MemberExpression, в частности, распадается на Idenfier. Т.е. с ключевым словом бы это прокатило, а вот с идентификатором - уже нет, это по-любому трактуется, как вызов функции.

Ну и, плюс, механизм автоматической вставки точки с запятой делает своё дело.

Сообщение от Kolyaj
Какие-то странные у тебя вопросы сегодня.
Сообщение от Dmitry A. Soshnikov
Возможно ли получить подобную ошибку и "смотря, что пишешь"?
Имелось в виду, что не будет опечатки (т.е. тот, кто пишет, "смотрит, что он пишет"), но будет та же ошибка. Самый простой пример - возврат объекта через инициализатор:

return // undefined
{
  x: 10
};

return {
  x: 10
}; // object


Сообщение от Dmitry A. Soshnikov
Возможно ли избежать подобную ошибку, "не смотря, что пишешь"?
Имелось в виду, избежать RuntimeError, но всё же сделать опечатку (т.е. "не смотреть, что пишешь"), и получить SyntaxError:

iff (!x) { // SyntaxError
  x = 1;
}


subzey,

Сообщение от subzey
{ /* начинаем объявление объекта */ x = 1; /* ошибка синтаксиса, что-то типа «недопустимое имя свойства»? */ }
Уже отмечали (Gvozd) - синтаксической ошибки не будет, так как это блок кода, а не инициализатор объекта.

Ниже - синтаксически правильная ECMAScript-программа, состоящая из блока и пустой инструкции:

{
  ;
}


P.S.: ещё (классические) примеры:

a = b + c
({x: 10}).x


Здесь наоборот, точка с запятой не будет поставлена в конце первой строки, поскольку "c(... )" - это вызов функции с аргументом "{x: 10}".

Или:

var foo = function () {
  alert(arguments[0]);
}

(function () {return 'x';}())


Так же, точка с запятой не ставится; это вызов первой анонимной функции, в которую параметром передаётся результат вызова второй анонимной функции.

var foo = function () {
  alert(arguments[0]);
};

(function () {return 'x';})();


А так - верно: описание первой анонимной функции (которая сохраняется в foo); далее описание и вызов второй анонимной функции.
__________________
Тонкости ECMAScript

Последний раз редактировалось Dmitry A. Soshnikov, 13.01.2010 в 14:55.
Ответить с цитированием