Является ли каждая функция в JS закрытием - PullRequest
5 голосов
/ 04 апреля 2019

Я читал немного о closures в JS.Я прошел через различные руководства, как этот https://medium.freecodecamp.org/javascript-closures-simplified-d0d23fa06ba4

У меня все еще есть один вопрос.Относится ли замыкание только к функции первого порядка (функция, возвращающая функцию).Или какая-то функция closure?Единственное отличие, которое я вижу на самом деле, в том, что если какая-то функция не является вложенной, одна из трех цепочек областей видимости (область видимости внешней функции) будет пустой, но ее не будет.

Ответы [ 2 ]

3 голосов
/ 04 апреля 2019

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

function add2(n) {
  return n + 2;
}

Эта функция возвращает только число; ничто не может ссылаться на что-либо в замыкании, созданном вызовом функции, поэтому замыкание исчезает, и все, что у вас остается, это возвращаемое значение.

Закрытие становится интересным, когда функция возвращает то, что имеет один или несколько «хуков», в локальную среду, созданную при вызове функции. (Функция может открывать замыкание, изменяя также глобальную среду.) Итак, эта функция:

function addn(addend) {
  return function(n) {
    return n + addend;
  }
}

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

Я не могу придумать, каким образом обычная функция может представить замыкание, которое каким-то образом не включает в себя одну или несколько функций, которые ссылаются на вещи из локального контекста (параметры, переменные). (Функции генератора интересны, потому что yield своего рода всегда возвращает что-то, что представляет закрытие, я полагаю.)

1 голос
/ 04 апреля 2019

Закрытие - это комбинация функции и лексической среды, в которой эта функция была объявлена ​​

например,

 function greet(Say){
   return (
          function(name){
             console.log(Say + ' ' + name);
          }
   )
}

Теперь я могу сделать что-то подобное,

greet('Hi')('Alex')

Эта строка возвращает строку 'Привет, Алекс'

Теперь я собираюсь сделать что-то вроде этого,

var sayGreet = greet('Hi');

Если я console.log (sayGreet), это будет функция.

Теперь скажите мне, где определена эта переменная sayGreet? Это на глобальном уровне. Или в другом слове глобальный контекст выполнения.

Теперь давайте сделаем,

sayGreet('Alex')

внутри этой функции sayGreet у нас есть console.log(Say + " " + name). Мы знаем, что name Алекс, а как насчет Say? На данный момент нет никаких признаков Say, потому что функция greet уже завершила выполнение и вернула функцию.

Несмотря на то, что в JavaScript все еще есть возможность ссылаться на значение Say. Даже завершено исполнение. Это значение Say может быть доступно только внутренним или вложенным функциям.

Это закрытие вызова. Одна функция не может быть закрытием. Должна быть и внешняя лексическая среда.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...