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)

victor256 01.07.2019 14:41

Нужна помощь в объяснении синтаксиса (говно)кода
 
Приветствую. Есть такое:


Этот код поставил меня в тупик. Так много вопросов и так мало ответов.
1) что это вообще за синтаксис сверху: !function и далее функции через запятую?
2) зачем делать
var $ = jQuery;

есть ли в этом неведомый мне смысл?

рони 01.07.2019 15:02

victor256,
1) ! способ запустить функцию, сразу после создания.
2) так короче.

Malleys 01.07.2019 21:59

Цитата:

Сообщение от victor256
1) что это вообще за синтаксис сверху: !function и далее функции через запятую?

Дело в том, чтобы вызвать анонимную функцию, она должна быть выражением. Функцию можно сделать выражением, заключив её в скобки!
(function(e) { /* ... */ })(jQuery);
Этот вызов функции представляет выражение, которое возвращает функция.

С ним можно работать, как с любым другим выражением, например если функция возвращает булево значение, то можно применить оператор «не», который поменяет булево значение на противоположное. Конечно же результат такого вычисления должен быть записан в переменную, иначе оно бессмысленно и может быть упрощено.

var isSomethingNotTrue = !(function(e) { /* ... */ })(jQuery);
Можно убрать лишнюю пару скобок
var isSomethingNotTrue = !function(e) { /* ... */ }(jQuery);
Получилось как у вас, но у вас результат никуда не записывается, так что можно упростить до первого варианта, который я привёл выше.

Цитата:

Сообщение от рони
1) ! способ запустить функцию, сразу после создания.

Интересно, что это не запускает никакую функцию вообще!

Если что-то перечисляется через запятую, то оно становится выражением! Обратите внимание, что третье выражение у вас вызывается нормально!

Цитата:

Сообщение от victor256
2) зачем делать
var $ = jQuery

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

рони 01.07.2019 22:16

Цитата:

Сообщение от Malleys
Интересно, что это не запускает никакую функцию вообще!

не понимаю.
function() {
  alert("1");
}();
так не сработает
а так сработает
!function() {
  alert("1");
}();

что это, если не способ запустить(вызвать) функцию? от того что в результате получится выражение, по сути то - это запуск функции.

Malleys 01.07.2019 22:40

Цитата:

Сообщение от рони
не понимаю.

Не знаю, что вы пытаетесь доказать...
Цитата:

Сообщение от рони
так не сработает

Конечно же нет, там нет выражения
Цитата:

Сообщение от рони
а так сработает

Метод псевдонаучного тыка?

Я же написал, вы бы сначала почитали...

Ваше не понимаю, записывается так... (должно быть выражение)
(function() {
  alert("1");
})();


Цитата:

Сообщение от рони
а так сработает

А зачем вам вычислять булево выражение? понятно, что true будет, функция возвращает undefined... Но зачем, вы же не используете это нигде!!!

var myHappyBoolean = !function() {
  alert("1");
}();

alert(myHappyBoolean); // true


Цитата:

Сообщение от рони
что это, если не способ запустить(вызвать) функцию?

Вы запускаете функцию и ещё вычисляете.

рони 01.07.2019 22:43

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

Malleys 01.07.2019 22:52

Цитата:

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

Почему следует произвести ещё одну операцию после того, как была вызвана функция?

!function() {
  alert("1");
}();


-function() {
  alert("1");
}();


+function() {
  alert("1");
}();


~function() {
  alert("1");
}();


[function() {
  alert("1");
}()];


Почему нельзя сразу вызвать функцию?

(function() {
  alert("1");
})();

рони 01.07.2019 22:55

Цитата:

Сообщение от Malleys
Вы запускаете функцию

Цитата:

Сообщение от Malleys
это не запускает никакую функцию

извините, но это бред какой-то, вы меня развеселили, думаю ваши обьяснения пригодятся, на форуме есть 3 или 4 темы, по заданным в начале вопросам, к сожалению я их не нашёл.

рони 01.07.2019 22:58

Malleys,
то есть вы полностью отрицаите, возможность использования ! и других знаков?

Malleys 01.07.2019 23:09

Цитата:

Сообщение от рони
то есть вы полностью отрицаете, возможность использования ! и других знаков?

Да, если они будут производит работу в холостую! А если функция реально что-то вычисляет и возвращает, то конечно же вы можете применить оператор ! и затем присвоить результат такого вычисления переменной, чтобы дальше с ней работать!

То, что вы показали с оператором !, на самом деле бессмысленно, зачем это вычисление? На получаемый объект никакая переменная не ссылается, и по сути сборщик мусора может сразу его удалить.

Цитата:

Сообщение от рони
извините, но это бред какой-то, вы меня развеселили

А что тут смешного? Вы запускаете функцию при помощи (), а это [оператор !] не запускает никакую функцию.

Так всё же, почему вам нельзя просто вызвать функцию?
(function() {
  alert("1");
})();

рони 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

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

j0hnik 02.07.2019 13:37

https://jsperf.com/e4543fdsf453
сделал с максимально простой с равными условиями, в фф пашет

Alexandroppolus 02.07.2019 21:59

Цитата:

Сообщение от j0hnik
соскучился по всем !!!

Привет.
Здесь нынче интересные вопросы редко бывают, народ уже дискутирует по пустякам)

j0hnik 03.07.2019 08:24

Цитата:

Сообщение от Alexandroppolus
Здесь нынче интересные вопросы редко бывают, народ уже дискутирует по пустякам)

Заглядываю иногда как гость, смотрю одним глазом.


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