Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Нужна помощь в объяснении синтаксиса (говно)кода (https://javascript.ru/forum/misc/77908-nuzhna-pomoshh-v-obyasnenii-sintaksisa-govno-koda.html)

рони 01.07.2019 23:22

Цитата:

Сообщение от Malleys
Так всё же, почему вам нельзя просто вызвать функцию?

ок, я вызову функцию, не превращая её в выражение. слон я слон, только по голове не бей.

рони 01.07.2019 23:30

Enter Sandman

Vlasenko Fedor 02.07.2019 01:19

Цитата:

Сообщение от Malleys (Сообщение 509701)
Вы запускаете функцию и ещё вычисляете.

С каких делов в js вычисляются неиспользуемые выражения
Вы напрочь забыли (не знаете )про анализатор кода языка
Да когда вы вызываете alert в своем синтетическом примере оно вычислит, потому как вы запрашиваете значение.

Цитата:

Сообщение от Malleys (Сообщение 509696)
Знак доллара является разрешенным символов для идентификатора в языке Javascript. jQuery использует знак $ как сокращение для идентификатора jQuery.

Садитесь 3 здесь переменной $ явно присваивается объект jQuery, так как может быть и другой фреймворк (тот же mootools)

j0hnik 02.07.2019 04:17

:) соскучился по всем !!! :victory:

Цитата:

Сообщение от Poznakomlus
С каких делов в js вычисляются неиспользуемые выражения

var time = performance.now();
var i = 10000000;
  while(i--) (()=>Math.random()*Math.random())();
time = performance.now() - time;
console.log('Время выполнения = ', time);


var time = performance.now();
var i = 10000000;
  while(i--) ;
time = performance.now() - time;
console.log('Время выполнения = ', time);


вот вычисляет все же, и забывает напрочь

j0hnik 02.07.2019 04:19

можно присвоить значение переменной для наглядности, время не изменится

Malleys 02.07.2019 05:45

Цитата:

Сообщение от j0hnik
вот вычисляет все же, и забывает напрочь

j0hnik, супер!

Цитата:

Сообщение от Poznakomlus
С каких делов в js вычисляются неиспользуемые выражения

А зачем писать неиспользуемые выражения?

Цитата:

Сообщение от Poznakomlus
Садитесь 3 здесь переменной $ явно присваивается объект jQuery, так как может быть и другой фреймворк (тот же mootools)

Я говорю про идентификаторы! Идентификатор $ используется как сокращение для идентификатора jQuery, это сделано путём присвоения двум разным переменным одного и того же объекта, т. е. $ === jQuery.

Цитата:

Сообщение от Poznakomlus
переменной $ явно присваивается объект jQuery, так как может быть и другой фреймворк (тот же mootools)

Т. е. в случае, когда не может быть другого фреймворка, то переменной $ неявно присваивается объект jQuery?

Цитата:

Сообщение от Poznakomlus
alert в своем синтетическом пример

Вы понимаете, что там может быть и другой код?

Цитата:

Сообщение от Poznakomlus
Вы напрочь забыли (не знаете )про анализатор кода языка

Речь-то идет о восклицательном знаке перед выражением, которое получено путём вызова анонимной функции!

Цитата:

Сообщение от рони
слон я слон, только по голове не бей.

Не уклоняйтесь от восклицательного знака!
У вас функция даже не возвращает булево значение!

Интересно, что если вашу идею (подставлять восклицательный знак) выразить через типизированный язык, то такой код даже не возможно скомпилировать! Почему же некоторые программисты на JS готовы вставлять такое в свой код?

Например, на C# можно записать подобную синтаксически правильную конструкцию, но её невозможно скомпилировать из-за противоречия в типе выражения!
using System;

class MainClass {
	public static void Main (string[] args) {
		!((Action)(() => {
			Console.WriteLine("1");
		}))();
	}
}


Даже если исправить противоречие... компилятор знает, что вы хотели всё-таки что-то другое!
using System;

class MainClass {
	public static void Main (string[] args) {
		!((Func<bool>)(() => {
			Console.WriteLine("123");
			return false;
		}))();
	}
}
В частности в ошибке компиляции говорится, что Only assignment, call, increment, decrement, await, and new object expressions can be used as a statement. Видите, компилятор подсказывает, что всё-таки тут необходимо присвоение переменной!

Совершенно бессмысленный пример, показывающий правильное использование восклицательного знака! (Смотри также пост №5)
using System;

class MainClass {
	public static void Main (string[] args) {
		var ok = !((Func<bool>)(() => {
			Console.WriteLine("123");
			return false;
		}))();

		Console.WriteLine(ok);
	}
}

... и вообще, так обычно в C# не пишут! Всё намного проще!

Далее про JavaScript...
Нужен вызов функции? Пишете её, даёте ей имя и вызываете без всяких понтов, крестов и восклицательных знаков!
function main() {
    /* код программы */
}

main();

И что тут вам не понятно?

Нужен вызов анонимной функции? Пишете её, даёте ей имя (а можете и не давать) и вызываете без всяких понтов, крестов и восклицательных знаков!
(function main() {
    /* код программы */
})();

Хотя это рабочий код, но возникает вопрос, а зачем такое нужно? Оно может быть полезно, если main является асинхронной функцией (потому что вам потребовался await) или вы хотите обратить внимание на название функции (что это точка входа, всё начинается здесь)

Я думаю, в большинстве остальных случаев можно обойтись и блоком...
{
    /* код программы */
}


... или даже без него!
/* возможно импорт */
/* код программы */
/* экспорт */
Всё намного проще!

Vlasenko Fedor 02.07.2019 09:30

j0hnik,
var time = performance.now();
var i = 10000000;
  while(i--) ;
time = performance.now() - time;
console.log('Время выполнения = ', time);

var time = performance.now();
var i = 10000000;
  while(i--) (()=>Math.random()*Math.random())();
time = performance.now() - time;
console.log('Время выполнения = ', time);

поменяйте местами вызов функций в своем примере :)

Malleys 02.07.2019 10:30

Цитата:

Сообщение от Poznakomlus
поменяйте местами вызов функций в своем примере

Результаты теста тоже поменялись местами... Или в чём заключается это злорадство?

рони 02.07.2019 10:35

Цитата:

Сообщение от Malleys
Не уклоняйтесь от восклицательного знака!

что это, о чём это, можно как то попроще, мне недоступна ваша логика.

Vlasenko Fedor 02.07.2019 11:50

присоединяйтесь к тестам


Часовой пояс GMT +3, время: 08:16.