Новости

19.11.2021

Книга «{Вы пока еще не знаете JS} Область видимости и замыкания. 2-е межд. издание»

Вы уже прочитали «Познакомьтесь, JavaScript»? Тогда откройте вторую книгу серии «Вы пока еще не знаете JS», чтобы познакомиться поближе с первым из трех столпов JavaScript — системой областей видимости и функциональными замыканиями, а также с мощным паттерном проектирования «Модуль». Пора освоить правила лексических областей видимости для размещения переменных и функций в правильных позициях. И заглянуть на более низкий уровень, ведь магия с хранением состояния модулей базируется на замыканиях, использующих систему лексических областей видимости.

Вашему вниманию предлагается 2-е издание снискавшей популярность серии книг «Вы не знаете JS»: «Вы пока еще не знаете JS» (YDKJSY).

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

Если вы читаете эти книги впервые, я рад, что они попались вам на глаза. Подготовьтесь к увлекательному путешествию по закоулкам JavaScript.

Если вы недавно занимаетесь программированием или JS, то учтите, что эти книги не задумывались как «деликатный вводный курс по JavaScript». Временами материал становится сложным и требующим серьезных усилий, и многие темы рассматриваются намного глубже, чем в книгах для новичков. Книга может пригодиться всем читателям независимо от уровня подготовки, но я писал ее с прицелом на то, что вы уже знакомы с JS, а ваш практический опыт работы с этим языком составляет хотя бы полгода, если не больше.

Где использовать let?


Мой совет ограничить использование let (почти всегда) только функциональной областью видимости верхнего уровня означает, что в большинстве других объявлений должно использоваться ключевое слово let. Но возможно, вас все еще интересует, как решить, какой тип выбрать для каждого объявления в вашей программе?

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

Ответив на этот вопрос, вы будете знать, к какой области видимости должна принадлежать переменная — блоковой или функциональной. Если вы изначально решили, что переменная должна иметь блоковую область видимости, а позднее осознаете, что ее следует поднять до функциональной области видимости, это повлияет не только на местоположение объявления этой переменной, но и на используемое при объявлении ключевое слово. Процесс принятия решений должен проходить именно так.

Если объявление принадлежит блоковой области видимости, используйте let. Если оно принадлежит функциональной области видимости, используйте var (еще раз: это только мое мнение).

Чтобы понять суть этого решения, можно подумать, как бы выглядела версия этой программы до ES6. Например, вспомним приведенную выше функцию diff(..):

В этой версии diff(..) переменная tmp очевидно объявляется в функциональной области видимости. Подходит ли это для tmp? На мой взгляд, нет. Переменная tmp нужна только для этих нескольких команд. Для команды return она не нужна, поэтому должна иметь блоковую область видимости.

До выхода ES6 ключевого слова let не было, поэтому придать ему блоковую область видимости было невозможно. Но для передачи ваших намерений можно было использовать доступные средства:

Объявление var для переменной tmp внутри команды if сигнализирует читателю кода, что tmp принадлежит этому блоку. Несмотря на то что JS не ограничивает область видимости, семантический сигнал все равно принесет некоторую пользу для читателя вашего кода.

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

В другом примере исторически использовалось объявление var, но теперь практически всегда в цикле for должно использоваться let:

Где бы ни определялся такой цикл, переменная i, по сути, всегда используется только внутри цикла; в этом случае принцип наименьшего раскрытия требует, чтобы она объявлялась с ключевым словом let вместо var:

Подобное переключение с var на let нарушит работоспособность вашего кода только в одном случае: если он зависит от обращения к переменной цикла (i) за пределами/после цикла:

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

 

Переменная lastI нужна во всей области видимости, поэтому она объявляется с ключевым словом var. Переменная i нужна только в (каждой) итерации цикла, поэтому она объявляется с ключевым словом let.

С полным содержанием статьи можно ознакомиться на сайте "Хабрахабр":

https://habr.com/ru/company/piter/blog/587888/


Комментарии: 0

Пока нет комментариев


Оставить комментарий






CAPTCHAОбновить изображение

Наберите текст, изображённый на картинке

Все поля обязательны к заполнению.

Перед публикацией комментарии проходят модерацию.