@Alex_87

Объект первого класса?

Добрый день, всем! Не совсем понятна теория в уроке про объекты первого класса(вопрос ниже под теорией)
Объекты первого класса
Продолжая тему предыдущего урока, познакомимся с понятием "first-class citizen" или "объекты первого класса".

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

А теперь посмотрите внимательно на этот код: const x = () => console.log('hey'). Ничего необычного, вы видели и писали подобное множество раз. Если вы считаете, что в этом коде создаётся функция x, на самом деле это не так. Здесь происходят следующие две операции:

Создание функции: () => console.log('hey')
Создание константы со значением в виде функции: const x =
Этот момент нужно хорошо прочувствовать. Минимальное определение функции, которое только возможно, выглядит так: () => {}. Это пустая функция с пустым телом, которая не делает ничего. Присваивать её константе или нет — вопрос отдельный. Вполне допустимо написать и выполнить подобную программу: (a, b) => a + b;. Попробуйте поэкспериментировать в REPL.

Из примеров выше можно сделать вывод, что функция — тоже данные, ведь её можно присвоить константе. Рассмотрим это утверждение на практике:

const identity = v => v; // функция: v => v, константа: identity
console.log(identity(10)); // => 10

const z = identity;
console.log(z === identity); // => true

const x = 5;
console.log(z(x) === identity(x)); // => true
Выше определена функция, которую обычно называют identity. Она возвращает то значение, которое было ей передано. На практике такая функция нужна редко, но она очень хорошо подходит для демонстрации. Далее я создал новую константу, которую связал с той же функцией.

Главный вывод, который можно сделать из кода выше, заключается в том, что определение функции — это выражение, а значит оно возвращает значение, а именно — функцию. А раз определение функции — выражение, возвращающее функцию, то мы можем попробовать вызвать её без создания промежуточной константы:

// Определяем функцию v => v и тут же вызываем ее
(v => v)('run'); // run

// Тот же код с использованием промежуточной константы.
// Попробуйте мысленно заменить `identity` на `v => v`, тогда
// получится (v => v)('run'). С выражениями так можно поступать всегда.
// const identity = v => v;
// identity('run'); // run
Скобки вокруг определения функции — не какой-то особый синтаксис. Здесь они используются с той же целью, что и в арифметических операциях — для группировки. Без них выражение v => v('run') приобретает совсем другой смысл. В этом случае в нём создаётся функция, принимающая на вход другую функцию v и вызывающая её внутри с аргументом 'run'.

Попробуем усложнить:

identity(v => v)('run'); // run
// (v => v)(v => v)('run') // run
Первым идёт пример вызова функции по идентификатору, а во втором примере я заменил идентификатор на определение функции, сделав подстановку. Результат получился тот же самый. Ещё раз посмотрите на этот шаблон (<тут определение функции>)(). Попробуйте самостоятельно разобрать пример ниже:

((a, b) => a + b)(3, 2); // 5
// const sum = (a, b) => a + b;
// sum(3, 2); // 5
Теперь попробуем использовать функции как данные ......

ВОПРОС
Подскажите пожалуйста, как понять эту запись в уроке?
identity(v => v)('run'); // run
// (v => v)(v => v)('run') // run
Эта запись:
identity(v => v)('run');
такая же как и
(v => v)('run'); ?

Я не понимаю, к чему вообще этот пример.
identity(v => v)('run'); // run
// (v => v)(v => v)('run') // run

Что авторы хотели этим показать?
  • Вопрос задан
  • 415 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы