Когда функция создана в JavaScript, закрытие создается с ним одновременно, но что такое закрытие?
Замыкание
Закрытие представляет собой комбинацию функции, объединенной вместе со ссылками на его окружающее состояние или немного более абстрактно, думать о закрытии как невидимый объект, который хранит переменные и параметры, созданные в функции.
Лексическая область
Лексическая проверка описывает, как анализатор разрешает имена переменных, когда функции вложены. Слово Лексический Относится к тому, что лексическое определение навеса использует местоположение, где переменная объявляется в исходном коде для определения того, где доступна эта переменная. Вложенные функции имеют доступ к переменным, объявленным в их внешнем объеме.
Давайте посмотрим на пример лексической области:
function init() { let name = 'Mario'; // name is a local variable created by init function displayName() { // displayName() is the inner function, a closure alert(name); // use variable declared in the parent function } displayName(); } init();
Функция DisplayName ()
не имеет локальной переменной самостоятельно. Это внутренняя функция и имеет доступ к переменным внешней функции.
Закрытие
Закрытие – это Сочетание функции , и лексическая среда в том, что была объявлена эта функция. Давайте посмотрим на какой-нибудь код:
function alertDisplayName() { let name = 'Mario'; function displayName() { alert(name); } return displayName(); } const myFunction = alertDisplayName(); myFunction();
Запуск этого кода будет иметь тот же эффект, что и init ()
функция сверху. DisplayName ()
Внутренняя функция возвращается из внешней функции Перед выполнением Отказ
Сначала это может показаться неверным, что код работает успешно. Это зависит от вашего фона программирования, на некоторых языках, локальные переменные внутри функции существуют только во время выполнения функции. В JavaScript функции формы закрываются. Закрытие – это сочетание функции, а лексическая среда, в которой была объявлена эта функция. Эта лексическая среда или статический контекст состоит из любых локальных переменных, которые были включены во время создания закрытия. Застежки создаются одновременно функциями созданы.
В примере кода выше, Myфункция
это ссылка на экземпляр функции DisplayName
это создано, когда alertdisplayname
бежит. Экземпляр DisplayName
поддерживает ссылку на ее лексическую среду, в рамках которой существует имя переменной. Следовательно, когда Myфункция
Запускается, имя переменной остается доступным для использования, а Марио
передается на оповещение
Отказ
Давайте посмотрим на другой кусок кода:
function addNumbers(num1) { return function(num2) { return num1 + num2; }; } const add3 = addNumbers(3); console.log(add3(3)); // will log 6
Функция addnumbers
по сути, а Функциональная фабрика . Это создает функцию, которая может добавить конкретное значение для их аргумента. Лексическая среда, хранящаяся для постоянной Add3
будет для num1 = 3
Отказ
Закрытия полезны потому что они позволяют вам ассоциированные данные (лексическая среда) с функцией который работает на этих данных.
Другим примером инкапсулирующего состояния с использованием объема закрытия будет заключать секрет:
unction createSigner (secret) { const keypair = createKeypair(secret) return function (content) { return { signed: cryptoSign(content, keypair.privateKey), publicKey: keypair.publicKey } } } const sign = createSigner('super secret thing'); const signedContent = sign('sign me'); const moreSignedContent = sign('sign me as well');
В фрагменте кода выше createkeypair.
и Криптосинь
Являются исключительно для изложения концепции инкапсуляции секретов.
Область закрытия может также использоваться в качестве альтернативы прототипом наследования, но он не использует цепь прототипа и не полагается на неявную Это
ключевое слово.
function animal(name) { const eat = () => { console.log(name + ' eats'); }; return { eat }; } function dog(name) { name = name + ' the dog'; const bark = () => { console.log(name + ' barks'); }; return { ...animal(name), bark, }; } const henry = dog('Henry'); henry.eat(); // prints "Henry the dog eats" henry.bark(); // prints "Henry the dog barks"
Преимущество использования масштаба замыкания для композиции объектов состоит в том, что он устраняет Сложность прототипов , контекст (это) и нужно позвонить в функцию с новыми (который может иметь непреднамеренные побочные эффекты при опущении). Недостатком является то, что в том, что метод прототипа разделяется между несколькими экземплярами, подход с использованием прицела закрытия требует, чтобы внутренние функции созданы в течение экземпляра. Двигатели JavaScript используют все более сложные методы оптимизации внутри, поэтому важно быть только достаточно быстрыми для любого данного случая использования.
Это Рекомендуется использовать функциональную композицию над прототипом наследования и оптимизировать в более позднем этапе, если требуется.
TL; доктор
- Когда функция создана в JavaScript, закрытие создается с ним
- Закрытие – это сочетание функции, объединенной вместе со ссылками на его окружающее состояние
Спасибо за чтение, и если у вас есть вопросы Используйте Комментарий функция или Пришлите мне сообщение @mariokandut Отказ
Если вы хотите узнать больше о JavaScript Посмотрите на эти Учебники JavaScript Отказ
Ссылки (и большое спасибо)
Оригинал: “https://dev.to/mariokandut/what-is-closure-scope-oli”