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

На данный момент я работаю в LaunchSchool около двух месяцев. Это был постоянный поток совершенно новой информации, и, по общему признанию, может быть немного сложно уследить за каждой маленькой концепцией, которая вам представлена. Иногда эти «маленькие» понятия, которые остаются незамеченными, могут стать фундаментальной частью вашего учебного опыта. Для меня эта концепция заключалась в возвращаемых значениях.

У меня были серьезные проблемы с различными продвинутыми концепциями (ну, продвинутыми относительно 101), которые полагались на возвращаемые значения. Мне потребовалось некоторое время, чтобы вернуться назад и укрепить свое понимание возвращаемых значений, и я смог увидеть эти «продвинутые» концепции с новой точки зрения.

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

> let a = 5; // returns undefined
> a // returns 5

В первой строке let a = 5; возвращает undefined. Причина не очень важна на этом уровне, но вы обязательно должны знать, что объявление новой переменной всегда будет возвращать undefined. Вторую строку легче понять. Поскольку мы только что присвоили 5 a, легко увидеть, что вызов a вернет присвоенное ему значение 5.

Звучит довольно просто, но я обнаружил, что понимание возвращаемых значений особенно важно для одной из моих любимых концепций JS101 — цепочки методов. Я их большой поклонник, потому что они напоминают мне доказательства из школьной геометрии, которая была моим любимым занятием.

Цепочка методов использует несколько методов или функций в одном операторе. Вот как это может выглядеть:

> 'Hello'.toUpperCase().slice(2).charAt(2) // returns 'O'

Если вы не знакомы ни с одним из методов, использованных в этой статье, я бы посоветовал поискать в MDN! Я обещаю, что ни один из них не слишком сложен.

Мы начинаем со строки 'Hello’, а затем вызываем для нее метод toUpperCase(), преобразуя ее в верхний регистр. Затем мы используем slice(2), чтобы получить все, начиная с индекса 2 и далее. Наконец, мы используем charAt(2), чтобы получить символ с индексом 2, в конечном итоге возвращая 'O'.

Хорошо, но зачем нам для этого понимать возвращаемые значения? Важно понимать, что каждый вызов метода возвращает значение, даже если вы его не видите. Понимание этой концепции помогло цепочке методов стать для меня практически второй натурой. Разберем приведенный выше пример:

> 'Hello'.toUpperCase().slice(2).charAt(2)
Return values: 'HELLO' > 'LLO' > 'O'

Читается слева направо. Начиная с нашей строки 'Hello', мы затем вызываем для нее метод toUpperCase(). Это дает нам возвращаемое значение 'HELLO'. Далее мы используем slice(2), поэтому получаем 'LLO'. Наконец, мы используем charAt(2), чтобы получить значение по индексу 2 'LLO', которое равно 'O', нашему окончательному возвращаемому значению. Вы можете думать о каждом из этих промежуточных возвращаемых значений как о «невидимом», поскольку на самом деле вы нигде не видите их в консоли, но мы все равно можем вызывать для них методы.

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

> 'Drink more water'.slice(11).toUpperCase().concat('world')

Ответ ниже, не смотрите, если еще не пробовали!

========================================

> 'Drink more water'.slice(11).toUpperCase().concat('world')
Return values:        'water' >  'WATER'    >  'WATERworld'

Если быстро просмотреть это, slice(11) вернет все, начиная с индекса 11 и далее нашей исходной строки, 'Drink more water', поэтому она возвращает строку 'water'. Затем мы берем это возвращаемое значение и вызываем для него toUpperCase(), возвращая 'WATER'. Наконец, мы используем concat('world') для объединения 'WATER' со строкой 'world', что дает нам 'WATERworld'.

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

Другая концепция, которая использует возвращаемые значения аналогичным образом, — это доступ к вложенным объектам/массивам, но я приберегу ее для другого сообщения в блоге.

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