Кайл Симпсон

  • Amiran Bestaev (CHICO)цитує2 роки тому
    Сравните два предыдущих фрагмента. В первом фрагменте имя

    foo связывается с внешней областью видимости, и мы вызываем

    его напрямую foo(). Во втором фрагменте имя foo не связывается

    с внешней областью видимости, а только со своей функцией.

    Иначе говоря, (function foo(){ .. }) как выражение означает,

    что идентификатор foo находится только в области видимости,

    в которой находится .., а не во внешней области видимости. Со-

    крытие имени foo означает, что оно не будет без необходимости

    загрязнять внешнюю область видимости.
  • Amiran Bestaev (CHICO)цитує2 роки тому
    например (function foo(){ .. })(). Первая пара () преобразует

    функцию в выражение, а вторая пара () выполняет функцию.

    Этот паттерн настолько распространен, что несколько лет назад

    сообщество выработало для него специальный термин: IIFE (со-

    кращение от «Immediately Invoked Function Expression», то есть

    «немедленно вызываемое функциональное выражение»).

    68

    Глава 3. Функциональные и блочные области видимости

    Конечно, для IIFE имена не обязательны, в самой распространен-

    ной форме IIFE используется анонимное функциональное вы-

    ражение. Именованные IIFE, хотя и встречаются безусловно реже, обладают всеми преимуществами перед анонимными функцио-

    нальными выражениями, так что эту практику стоит взять на

    вооружение.
  • Amiran Bestaev (CHICO)цитує2 роки тому
    Вся суть блочной области видимости заключается в том, чтобы

    объявлять переменные как можно ближе к месту их использова-
  • Amiran Bestaev (CHICO)цитує2 роки тому
    ния, делая их как можно более локальными.
  • Amiran Bestaev (CHICO)цитує2 роки тому
    К счастью, в ES6 ситуация изменилась. Появилось новое ключе-

    вое слово let, которое используется наряду с var для объявления

    переменных.

    Ключевое слово let присоединяет объявление переменной к об-

    ласти видимости того блока (обычно паре фигурных скобок {..}), в которой оно содержится. Иначе говоря, let неявно заимствует

    область видимости любого блока для объявления своей перемен-

    ной.
  • Amiran Bestaev (CHICO)цитує2 роки тому
    Однако объявления с let не будут подниматься на всю область

    видимости того блока, в котором они присутствуют. Такие объ-

    явления не будут «существовать» в блоке до команды объявле-

    ния.

    { console.log( bar ); // ReferenceError!

    let bar = 2;

    }
  • Amiran Bestaev (CHICO)цитує2 роки тому
    Объявление явных блоков для переменных с целью их локальной

    привязки — мощный инструмент, который вам стоит добавить

    в свой инструментарий программирования.
  • Amiran Bestaev (CHICO)цитує2 роки тому
    Сначала функции

    Поднимаются как объявления функций, так и объявления пере-

    менных. Но здесь есть один нюанс (который может проявиться

    в коде с несколькими «дубликатами» объявлений): сначала под-

    нимаются функции, а затем переменные.
  • Amiran Bestaev (CHICO)цитує2 роки тому
    Замыкание — способность функции запоминать свою лексиче-

    скую область видимости и обращаться к ней даже тогда, когда

    функция выполняется вне своей лексической области видимости.
  • Amiran Bestaev (CHICO)цитує2 роки тому
    Какой бы механизм ни использовался для транспортировки вну-

    тренней функции за пределы ее области видимости, она поддер-

    живает ссылку на область видимости, в которой была изначально

    объявлена, — и при каждом ее выполнении будет задействована

    эта ссылка.
fb2epub
Перетягніть файли сюди, не більш ніж 5 за один раз