Js, запятая вместо точки запятой

189
31 января 2018, 15:43

Почему такое выражение не выдаёт ошибку:

i=5,console.log(i)

а такое выражение выдаёт ошибку ?

var i=5,console.log(i)

такой синтаксис кода обычно в jquery-плагинах.
Как правильно составлять такие выражения через запятую?
к примеру чтобы можно ещё было добавить к вышеприведённому выражению функцию-обработчик

i=5, console.log(i),function test(){var test='test';alert(test);};
test();

это выражение выдаёт ошибку

Answer 1

В вашем примере есть два разных выражения, это оператор var и оператор ,(запятая). Поэтому рассматривать их надо отдельно друг от друга.

Оператор var позволяет определять переменные, при этом синтаксис позволяет определить сразу несколько, перечислив их через запятую. При этом значение может быть вычислено из сложных выражений.

var имя1 = значение1, имя2 = значение2, имя3, имя4, имя5 = значение5 ...

К примеру:

var a = 10,
    b = 20,
    c = a + b,
    d = function test() { return c; },
    e = d() * d()

Поэтому если сначала встретили слово var, то дальше запятая имеет отношение именно к нему.

И есть отдельно оператор , (запятая). Оператор "запятая" вычисляет оба операнда и возвращает значение второго, как правило он используется, когда хочется включить несколько выражений в то место, где должно быть одно (чаще всего объявление в цикле for).

1, 2  //-> 2
1, 2, 10 + 30 //-> 40
1, function test(){ console.log("test"); } //-> ƒ test(){ console.log("test"); }

Учитывая специфику его работы, то он не привяжет функцию к общему контексту и она не будет доступна по имени test(). Видимо она привязывается к внутреннему контексту выполнения. Но вы можете ее вернуть и использовать.

var test = (1, function test(){ console.log("test"); });
test();
Answer 2

В коде:

i = 5, console.log(i)

запятая является оператором.

А в коде:

var i = 5, console.log(i)

запятая не является оператором, а является частью синтаксиса объявления переменных с помощью ключевого слова var.

Синтаксис объявления переменных с помощью var выглядит так:

var varname1 [= value1 [, varname2 [, varname3 ... [, varnameN]]]];

Видно, что он допускает только переменные и их значения.

Синтаксис оператора запятой выглядит так:

expr1, expr2, expr3...

Вообще мне казалось, что не стоит использовать оператор запятую слишком часто, так как это может привести к ухудшению читаемости. Также связанный вопрос на английском: When is the comma operator useful? .

В то же время оператор запятая часто используется в минифицированном коде, так как в некоторых случаях позволяет уменьшить размер кода.

Как правильно составлять такие выражения через запятую?

Сначала объявить все необходимые переменные, а потом в одной строчке через запятую производить с ними действия. При этом для функции тоже стоит объявить переменную, а при использовании запятой присвоить этой переменной значение — анонимную функцию:

var i, test; 
i = 5, console.log(i), test = function() { console.log('test') }; 
test();

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

READ ALSO
jQuery параметры плагина

jQuery параметры плагина

Здравствуйте! Возникла проблема с плагином jQuery (самописка)Параметры, которые я записываю в переменную плагина при каждой новой инициализации...

172
Как отловить event в Lightbox Uikit?

Как отловить event в Lightbox Uikit?

Здравствуйте! Есть компонент lightbox в фреймворке Uikit, https://getuikitcom/docs/lightbox не совсем понятно как слушать события( Нужно при показе/перелистывание...

181
Скрипт работает неправильно при вызове from(arguments)

Скрипт работает неправильно при вызове from(arguments)

Добрый день, столкнулся с проблемой написал небольшой скрипт для проверки элементов массивов (проверка чтобы все жлементы первого массива...

181
Циклические операции на jquery

Циклические операции на jquery

Есть кнопкиКак узнать,то это кнопка? В классе присутствует "knopka"

172