Понимание замыканий в JavaScript

Замыкания — это функции, которые имеют доступ к переменным из области видимости другой функции. Это часто достигается путем создания функции внутри функции.

function createComparisonFunction(propertyName) {         
 return function(object1, object2) {
  let value1 = object1[propertyName];
  let value2 = object2[propertyName];

  if (value1 < value2) {
   return -1;
  } else if (value1> value2) {
   return 1;
  } else {
   return 0;
  }
 };
}
Вход в полноэкранный режим Выход из полноэкранного режима

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

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

По мере выполнения функции переменные ищутся в цепочке областей видимости для чтения и записи значений.

function compare(value1, value2) {
 if (value1 < value2) {
  return -1;
 } else if (value1> value2) {
  return 1;
 } else {
  return 0;
 }
}

let result = compare(5, 10);
Вход в полноэкранный режим Выход из полноэкранного режима

Этот код определяет функцию compare(), которая вызывается в глобальном контексте выполнения. Когда функция compare() вызывается в первый раз, создается новый объект активации, содержащий аргументы, значение1 и значение2. Объект переменной глобального контекста выполнения является следующим в цепочке областей видимости контекста выполнения compare(), которая содержит this, result и compare.

Объект this

Использование объекта this внутри замыканий влечет за собой некоторые сложности в поведении. Если функция не определена с помощью синтаксиса стрелок, объект this привязывается во время выполнения в зависимости от контекста, в котором выполняется функция: при использовании внутри глобальных функций this равен window в нестрогом режиме и undefined в строгом режиме, тогда как this равен объекту при вызове в качестве метода объекта.

Анонимные функции не привязаны к объекту в этом контексте, поэтому объект this указывает на window, если не выполняется в строгом режиме. Однако из-за того, как написаны закрытия, этот факт не всегда очевиден.

window.identity = 'The Window';

let object = {
 identity: 'My Object',      
 getIdentityFunc() {
  return function() {
   return this.identity;
  };
 }
};

console.log(object.getIdentityFunc()()); // 'The Window'
Вход в полноэкранный режим Выход из полноэкранного режима

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

window.identity = 'The Window';

let object = {
 identity: 'My Object',      
 getIdentityFunc() {
  let that = this;
  return function() {
   return that.identity;
  };
 }
};

console.log(object.getIdentityFunc()()); // 'My Object'
Вход в полноэкранный режим Выход из полноэкранного режима

Маловероятно, что вы намеренно будете использовать шаблоны во второй и третьей строках, но полезно знать, что значение this может меняться неожиданным образом при незначительном изменении синтаксиса.

[эта ссылка для получения дополнительной информации о замыканиях]https://developer.mozilla.org/en-US/docs/Web/JavaScript/Closures

поддержите меня для получения большего количества материалов

Оцените статью
Procodings.ru
Добавить комментарий