Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Какой резон передавать функции в другое место? (https://javascript.ru/forum/misc/76148-kakojj-rezon-peredavat-funkcii-v-drugoe-mesto.html)

hoz 09.12.2018 12:56

Какой резон передавать функции в другое место?
 
Читаю учебник. Хотя, это не первое упоминание о такой возможности, но. тем не менее, очередной раз я об этом услышал, но никаких доводов логичных для подобных возможностей в языке не сказано.
Вот пример:
var f = function factorial(n) {
  return n ? n*factorial(n-1) : 1;
};

var g = f;  // скопировали ссылку на функцию-факториал в g
f = null;

alert( g(5) ); // 120, работает!

Я вижу это так:
1. Копирование функции в другую переменную производить дублирование кода.
2. Увеличивает количество используемой памяти.
Ведь если есть функция, и она работает как нужно, то её нужно использовать, а не копировать куда-то, а потом использовать под другим именем. Абсурд какой-то, на первый взгляд.
Вот и хочется увидеть адекватный вариант применения такого похода, если, конечно, кто-нить это вообще использует.

laimas 09.12.2018 13:00

Цитата:

Сообщение от hoz
Копирование функции в другую переменную производить дублирование кода.

Это не копия и не дублирование, а ссылка на одну и туже функцию.
https://learn.javascript.ru/object-reference

hoz 09.12.2018 13:42

Цитата:

Сообщение от laimas (Сообщение 500107)
Это не копия и не дублирование, а ссылка на одну и туже функцию.
https://learn.javascript.ru/object-reference

А что мешает воспользоваться базовой переменной, а не той, в которую копируется ссылка на ту же переменную, что и базовая?
Я провожу аналогию. Такого в других языках не встречалось.. Дико, на самом деле))

laimas 09.12.2018 14:02

Цитата:

Сообщение от hoz
Такого в других языках не встречалось.. Дико, на самом деле

Да неужто, например и т.п.

hoz 09.12.2018 14:18

Цитата:

Сообщение от laimas (Сообщение 500110)
Да неужто, например и т.п.

Я имел ввиду Java, C#, в основном. Другие не рассматриваю, т.к. на другом не писал. Писал ещё на 1 и пишу, но там разработка не программ, а ботов. И он примитивнее. В первых двух такого нет.

laimas 09.12.2018 14:23

Что вам найти применение ссылок в Си или сами найдете?

j0hnik 09.12.2018 18:19

https://www.youtube.com/watch?v=4oud...eWwem&index=21
первые две минуты

hoz 10.12.2018 18:14

Цитата:

Сообщение от j0hnik (Сообщение 500133)

Тема не раскрыта. Ну сказал он, что если присвоить одну переменную-объект в другую переменную-объект, то они будут ссылаться на один и тот же участок памяти. Так это я знаю уже несколько лет. Так во всех языках.
А вот какой с этого толк - тема не раскрыта.
Как я понимаю, используется это не часто. Как попадётся где-нить, то можно будет увидеть причину использования такого подхода..

SuperZen 10.12.2018 21:09

Будут асинхронные запросы, тогда и вопрос решится )

Белый шум 11.12.2018 00:50

hoz,
почитайте про замыкания в яваскрипте, когда из функции возвращается другая ф-я. Там эта возможность широко используется.

Для объектов/массивов очевидное применение - передача параметров в функцию по ссылке, чтобы не копировать большие объёмы данных лишний раз.

MallSerg 11.12.2018 01:27

1 - Копирование функции
В JS как и в других языках нет оператора копирования есть оператор присваивания. т.е. никакого копирования происходить не может. Обычно происходит присваивание переменной результата выражения стоящего справа. оператор function всегда создает новую функцию и возвращает ссылку на нее.
2 - "базовой переменной"
в языке нет такого типа данных как "базовая переменная".
3 - Я имел ввиду Java, C#, ... двух такого нет.
Забавно я всегда думал что библиотеки в этих языках на 99.999% состоят из ссылочных типов google
Очень важно различать сам объект и ссылку на объект.
Присваивание для сложных типов всегда копирует ссылку на объект.
Присваивание для примитивных типов создает новый объект и копирует значение полученное по ссылке.
Более наглядно это можно посмотреть в отладчике браузера. например в хроме клавиша F12->вкладка Memory-> и кнопка получить снапшот
и ты увидишь все объекты используемые на странице. те же функции числа и даже булевы значения.
Для доступа к этим данным в JavaScript используются высокоуровневая абстракция в виде двух древовидных структур(глобальная область видимости и текущий scope) которые позволяют манипулировать данными через имена переменных.Наглядно увидеть ссылки на данные можно набрав в console.log(window) в консоли.

К теме вопроса "Какой резон передавать функции в другое место?"
Функция становится такой же переменной как число строка или объект. подробнее

Пример в учебнике пытается наглядно показать что "ссылка на функцию" и "сама функция" это разные понятия и ссылкой на функцию можно манипулировать как переменной (принимать передавать изменять).
Простой пример где используется присвоение функций переменным это обработчики событий.
Это позволяет создавать и изменять объекты на лету в момент исполнения программы.


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