JavaScript

Джаваскрипт очень нужен, куда мы без него.

Function Declaration vs Function Expression

Давайте разберём ключевые отличия Function Declaration от Function Expression.

Во-первых, синтаксис: как определить, что есть что в коде.

  • Function Declaration: функция объявляется отдельной конструкцией «function…» в основном потоке кода.

    // Function Declaration
    function sum(a, b) {
      return a + b;
    }
    
  • Function Expression: функция, созданная внутри другого выражения или синтаксической конструкции. В данном случае функция создаётся в правой части «выражения присваивания» =:

    // Function Expression
    let sum = function(a, b) {
      return a + b;
    };
    

Более тонкое отличие состоит, в том, когда создаётся функция движком JavaScript.

Function Expression создаётся, когда выполнение доходит до него, и затем уже может использоваться.

После того, как поток выполнения достигнет правой части выражения присваивания let sum = function… – с этого момента, функция считается созданной и может быть использована (присвоена переменной, вызвана и т.д. ).

С Function Declaration всё иначе.

Function Declaration можно использовать во всем скрипте (или блоке кода, если функция объявлена в блоке).

Другими словами, когда движок JavaScript готовится выполнять скрипт или блок кода, прежде всего он ищет в нём Function Declaration и создаёт все такие функции. Можно считать этот процесс «стадией инициализации».

И только после того, как все объявления Function Declaration будут обработаны, продолжится выполнение.

В результате функции, созданные, как Function Declaration могут быть вызваны раньше своих определений.

Arrow Functions

This

Поведение ключевого слова this в JavaScript несколько отличается по сравнению с остальными языками. Имеются также различия при использовании this в строгом и нестрогом режиме.

В большинстве случаев значение this определяется тем, каким образом вызвана функция. Значение this не может быть установлено путем присваивания во время исполнения кода и может иметь разное значение при каждом вызове функции. В ES5 представлен метод bind(), который используется для привязки значения ключевого слова this независимо от того, как вызвана функция. Также в ES2015 представлены стрелочные функции, которые не создают собственные привязки к this (они сохраняют значение this лексического окружения, в котором были созданы).

Use Strict

Преимущества:

  • Не позволяет случайно создавать глобальные переменные.
  • Любое присваивание, которое в обычном режиме завершается неудачей, в строгом режиме выдаст исключение.
  • При попытке удалить неудаляемые свойства, выдаст исключение (в то время как в нестрогом режиме никакого действия бы не произошло).
  • Требует, чтобы имена параметров функции были уникальными.
  • this в глобальной области видимости равно undefined.
  • Перехватывает распространенные ошибки, выдавая исключения.
  • Исключает неочевидные особенности языка.

Недостатки:

  • Нельзя использовать некоторые особенности языка, к которым привыкли некоторые разработчики.
  • Нет доступа к function.caller и function.arguments.
  • Объединение скриптов, написанных в строгом режиме может вызвать проблемы.

Concurrency

  • Event Loop
  • Калбеки
  • промисы
  • async await
  • web workers