Короткого замыкания в JavaScript: практический пример, особенности и правила
Опубликованно 27.02.2019 01:22
В расписание короткого замыкания или английская версия "Центральная" - это способ реализации имя облигаций на язык функций первого класса. Быстро она-это запись, которая содержит функцию, вместе со средой. Окружающей среды-это свободное назначение каждой функции значение или ссылку на их имя, созданная Центральная в Javascript. Доступ к захватил переменных, через копий значений или ссылок, в том числе при вызове за пределы области. Понятие короткого замыкания
Закрытия были разработаны в 1960-х годах для оценки выражений вычисления и применять в 1970-х как функцию языка программирования PAL для поддержки функций первого класса лексической области. Питер Ленин дал определение термина "короткое замыкание" в 1964 году с окружением и управления части, которые применяются в автомобиле SECD с тем, чтобы оценить, лямбда-выражения, связанные с лексической среды, что привело к закрытию или короткое замыкание в Javascript.
Это объяснение вошло в 1975 году, как лексически ограниченный вариант ЛИСПА и был широко распространен. Лексическая среда-это набор реальных переменных в программе. Состоит из внутренней лексической среды, и ссылки во внешней среде, называется локальной переменной.
Лексические замыкания в Javascript являются особенности их внешней среды. Как в JavaScript все переменные имеют ссылку на тип. JS используется только ссылка на соответствующую ссылку в C ++ 11, и время жизни переменных не местные, из роли, распространяется на время жизни функции.
Первоклассные функции
Короткого замыкания в Javascript, как правило, встречаются в языках с великолепными значениями. Эти языки позволяют передавать функции в качестве аргументов. И вернуться вызовов функций, и соответствуют именам переменных. Это происходит, как простых типов, таких как строки и целые числа.
В этом примере лямбда-выражение (lambda (book) (>= (book-sales book) threshold)) появляется внутри функции best-selling-books. Когда вычисляется выражение, лямбда, схема круговорот, который состоит из кода, для лямбда-выражения и ссылки на пороговое значение переменной, которая является свободной переменной в лямбда-выражение. Короткого замыкания, а затем проходит фильтр функции, чтобы пламя несколько раз, чтобы определить, какие книги должны быть добавлены в список результатов, которые должны быть отброшены.
Потому что здесь, короткое замыкание в значение threshold, последний может использовать каждый раз, когда его filter вызывает. Функция filter может полностью определить отдельный файл. Вот тот же пример, человек в JS. Показывает нам, как работают замыкания под капотом) в Javascript.
Ключевое слово здесь используется вместо global filter функции, но в остальном структура и действие кодекса, являются одни и те же. Функция может создать короткое замыкание и вернуть его, потому что в этом случае происходит выполнение функции с переменными f и dx продолжают работать после работы, даже если выполнение оставила в его силах, и уже не видны.
В языках без короткого замыкания время жизни автоматического локальной переменной совпадает с выполнением кадр стека, в котором объявлена переменная. В языках с Javascript цепи и функции iife, переменные должны продолжать существовать до тех пор, пока блокировки имеют ссылки на них. Это чаще всего осуществляется с использованием какой-либо способ сбора мусора. Области применения
Преимущество короткого замыкания, что не сохранилась области "строку " видимость", или внешний "первичный" в контексте выполнения. Это может быть использовано несколькими способами, а стал полезным инструментом, чтобы избежать ряд ошибок JavaScript. Одним из самых распространенных является проблема "петли".
Проблемы с циклом происходит, когда пользователь создает функцию в цикле, и надеется, что текущее значение переменной останется в этой новой функции, даже если оно изменяется в контексте циклов, перед вызовом новой функции. Короткое замыкание, как они используются, не имеют ссылочной прозрачности, и, следовательно, уже не являются чистыми функциями, однако, как правило, используются нечистых функциональных языков, такие как Scheme. Чтобы понять, что такое замыкание в Javascript, то необходимо рассмотреть варианты использования. На самом деле, в практике, имеют множество применений: Можно использовать для определения структуры управления. Например, все управляющие структуры языка Smalltalk, в том числе ветки (if / then / else) и циклы while и for), идентифицируются объекты, методы, которые принимают короткое замыкание. Пользователи также могут использовать схему для определения структуры управления. В языках, которые реализуют назначение, можно создать атмосферу, программируемый, позволяет общаться конфиденциально и изменять эту среду. Застежка используется для реализации систем объектов. Создание как частных, так и общих методов, переменных, с помощью шаблонов модуля. Поскольку возвращаемые функцией наследуют сфере своей основной функции, доступны все переменные и аргументы в этом контексте. Это полезно в тех случаях, когда функция использует тот же ресурс для каждого вызова, но и создает ресурс в себе для него. Это обстоятельство делает метод неэффективным, которая решается исключительно положительным. Функционирование JavaScript
Согласно MDN (Mozilla Developer Network) "Замыкания являются функциями независимых переменных, которые "помнят" среде своего создания". И, как правило, когда функция заканчивается, ее локальные переменные уже не существует. Понять, как работают замыкания в Javascript, рассмотрев различные механизмы. Первый формальной логики. Например, при применении функции logName, который носит то же имя в качестве параметра и записывает. Затем создать цикл for для перебора списка имен, сделать 1 период ожидания, а затем вызвать функцию logName, переходя в нынешнее название.
В судьбе языка функции можно манипулировать таким же образом, как и другие типы данных, такие как int или string. Только этот механизм позволяет многим создавать удивительные вещи, например, присвоить функцию переменной для последующего звонка, или отправить в качестве параметра другой функции.
Этот принцип используется во многих структурах, а также обработчики событий DOM. Сначала "слушает" событие, а затем назначают функцию обратного вызова, которая будет вызываться каждый раз, когда происходит событие.
Анонимные функции
Анонимная функция-это функция без имени. Практически начинающих программистов находят каждый день, не понимая, игры с цифрами. Например, при выполнении операции сложения, можно пройти переменных, например: var x = 3; и = 5; var z = x + y.
Или если вы не намерены повторно обработать номер:var z = 3 + 5;
Это анонимные номера. Для анонимные функции можно объявить, при использовании "на ходу" - без прохождения переменной. Например, взять функцию do до:
do( function()
{ alert("Ceci est une fonction у них.");
}
);
Кроме того, существует альтернативный синтаксис объявления функции, которая подчеркивает, что, в то же время функции могут быть анонимными, и ссылаться на простые переменные, что это самый удобный способ установить функцию обратного вызова. Определение функций
На самом деле это тот же двигатель, но с этой точки зрения, можно увидеть, как происходит короткого замыкания, функции изнутри. Как видно, потому, что функции-это переменные, как и другие, не существует причины, по которой нельзя определить локально. На языке нулевого порядка, таких, как C, C ++ и Java, все функции определены на том же уровне видимости, в одном классе или в глобальном масштабе. С другой стороны, в JavaScript функции локальной исчезает, как и другие локальные переменные, как только заканчивается основной функции, так что это не видно из других функций.
Это на самом деле трудно, но в JavaScript есть способ управления видимостью переменных, и даже двумя способами. Присвоение глобальной переменной в JavaScript имеют такой же механизм, как в Java сложные объекты, массивы, элементы DOM и другие передаются по ссылке, поэтому в следующий код:
var tab = [51, 42, 69]; var tab2 = "tab".
Где, tab, tab2 - две ссылки в одной таблице, являются технически указателей, управляемых сборщиком мусора. Функции также передаются по ссылке. Переменная globalFn уже не скрывает. Заказ может сделать это, что было продемонстрировано на примере задач закрытия Javascript.
Это, как можно удалить в зависимости от местных условий, в случае, если выполняется функция других переменных. Простой пример: auto-increment, функцию, которая возвращает целое число, которое увеличивается на 1 при каждом вызове. В частности, вам нужна функция inc., который ведет себя следующим образом:
inc();
// retourne 0 inc();
// retourne 1 inc();
// retourne 2 inc();
// retourne 3
/ / ..
С закрытием выглядит:
function makeInc() { var x = 0; return function() { return x++; } } var inc = makeInc();
В последнем ряду, в тот момент, когда создается переменная, функция, inc., ведет какой-либо тип переменных, которые существуют вокруг, и в этом случае x. Создается невидимый объект вокруг функции, которые содержит эта переменная. Этот объект представляет собой функцию Loop Javascript. В этом случае, каждый экземпляр функции будет его цепи:
var inc1 = makeInc();
var inc2 = makeInc();
inc1();
// 0 inc1();
// 1 inc1();
// 2 inc2();
// 0 inc1();
// 3 inc2();
// 1 inc2();
// 2
Как видите, схема очень полезным во многих случаях. Конфликты имен переменных
Чтобы избежать конфликтов имен переменных, как правило, используются пространства имен. В JavaScript пространство имен, представляющих объекты, подобные любой другой.
Естественно, А. x и b x не является одной и той же переменной. Однако, если вы просто нужно запустить скрипт без сохранения переменных для остальных, можно использовать анонимную функцию, как короткое замыкание. Это дает несколько странный синтаксис. Хотя следующие две строки кода в среде довольно часто, с другой стороны, функция, которая находится вокруг, выполняется "на лету". Внимание скобки (), в конце концов. И для того, чтобы иметь возможность короткого замыкания, анонимные функции, да должен быть окружен скобками.
В этой анонимной функции используется локальная переменная, пункт. Это отличный способ избежать конфликтов имен или неуклюжесть, но также от атак XSS, пользовательские переменные защищены, никто не может изменить, чтобы повлиять на поведение скрипта.
Есть вариант: (function() {// ...}());
Обратить внимание на адаптацию скобки. Разница между этими двумя вариантами-это довольно трудно объяснить, поскольку они связаны с тем, что код считывается лексического анализатора. В обоих случаях функция считается выражение, но это выражение не вычисляется, в то же время. Просто помнить, что он берет две пары скобок: вокруг и позади нее. Javascript-программирование циклов
Когда пользователь выполняет большие объемы Javascript-программирования, трудно избежать циклов. Кто-то это безумие, после чего приходят к мысли, что все реализации Javascript есть серьезная ошибка. Если разработчик уже имеет цикл, что он не хочет превратить, чтобы использовать функции итератора, все, что вам нужно сделать-это схема, в которой определяются новые значения переменных. Они фиксируют текущее значение переменных и изменения на каждой итерации. Хитрость, чтобы поймать переменные-это то, внешнего короткого замыкания выполняется сразу же, в момент текущей итерации цикла. Можно использовать один из этих двух примеров подходов
Теперь есть еще одно упрощенное решение этой проблемы, потому что ключевое слово let поддерживается как в Firefox так и в Chrome. Это ключевое слово, вместо var переменного тока. Пусть работает, как по волшебству, потому что объявляется новая переменная j, значение i устанавливается Центральная в цикле. Однако, следует иметь в виду, что не продолжает существовать после конца итерации цикла, потому что оно локально. Петля и функция
For Цикл в JavaScript не является, так как цикл for в C или Java. На самом деле, больше похож на PHP. Самое главное знание циклов JS является то, что они не создают области. JS не имеет единства области, только в зависимости от количества. Это свойство можно рассматривать, в следующем фрагменте:
function foo() {var bar = 1;
for(var i = 0; i< 42; i++) {var baz = i;} /* more code */}
Понятно, что бар доступен на всей функции. Перед первой итерацией цикла baz будет иметь значение undefined. После цикла, что имеет значение 41 (и i будет 42). Таким образом, все переменные, объявленные в любом месте функции, будет доступна везде в роль и будет иметь значение только после того, как был он. Дроссельная заслонка и агрегирование
Закрытие-это не что иное, как функции в другие функции, и передаются в какой-то другой контекст. Называют короткое замыкание, потому что закрываются через локальные переменные, то есть, доступны и другие функции в области. Например, время, x, конечно, как вариант foo, и var bar = foo(2)() вернется 84.
Возвращенная функция foo имеет доступ к x. Все это важно, поскольку помогает разработчикам создавать функции внутри циклов, которые зависят от переменных цикла. Давайте посмотрим этот фрагмент кода, который присваивается нажать на драйвер из различных элементов:
// elements is an array of 3 DOM elements var values = ['foo', 'bar', 'baz'];
for(var i = 0, l = elements.length;
i< l; i++) {var data = values[i];
elements[i].onclick = function() {alert(data);
};
}
Значение, которое будет использоваться для предупреждения, при нажатии, будет одинаковой для всех, а именно, из баз. Затем вызывается обработчик событий, for уже завершен. JS не имеет области диска, то есть, все драйверы, использующие привязки к одной переменной data. После цикла, это значение values. Каждое объявление переменной создает место в памяти для хранения данных. В for эти данные снова и снова изменяют положение в памяти, остается неизменным.
Каждый обработчик события имеет доступ к той же позиции в памяти. Единственное решение-это зайти в другой области, чем "фиксированная" текущее значение data. JS имеет только область функции. Таким образом, вводится еще одна функция. Пример:
function createEventHandler(x) {return function() {alert(x);
}
}
for(var i = 0, l = elements.length;
i< l; i++) {var data = values[i];
elements[i].onclick = createEventHandler(data);
}
Это работает, потому что значение данных будет храниться в районе, createEventHandler и эта функция выполняется на каждой итерации. Это можно записать короче, используя сразу исполняемые функции:
for(var i = 0, l = elements.length;
i< l; i++) {var data = values[i];
elements[i].onclick = function(x) {function() {alert(x);
};
}
(data));
} Практический пример короткого замыкания в Javascript
Если пользователь выполняет короткого замыкания непосредственно на код в браузере, вы можете столкнуться с проблемой, потому что это может сделать любой ошибке синтаксиса. Если код выполняется непосредственно в браузере, то шансы очень высоки, что не компиляция процесс компиляции webpack. Возможные решения:
//main.js
function work(name){
return function (topic) {
console.log( What is ${тема} in ${name} );
}
}
work('Javascript')('Closure');
Сначала вызывается функция, и происходит аргумента имя. Теперь эта функция словаря также возвращает функцию, которая принимает также довод темы. Эта функция записывает вывод и на выходе имеется доступ к переменной.
Область функций Insider не ограничивается только этой функцией, таким образом, концепция называется Closure, поскольку имеет доступ к внешней области. Возвращает функция имеет доступ к внешней лексической областей и контекстов. Когда разработчик вызывает функцию, которая возвращает, первое, так называемые переменные функции, всегда доступны для внутренней функции. В следующем примере с помощью следующего кода.
Пример внутренней функции
Более подробную информацию о замыкании в Javascript, вы можете рассчитывать на второй пример. Теперь эта среда разрушается, но название параметра, который все еще существует. Создается новая внутренняя функциональная среда, которая является анонимной функцией. Имеет доступ к внешней зоне лексической среде.
Таким образом, в переменной внешней среде, по-прежнему существует, так что анонимная функция, которая имеет доступ к переменной, имя печатается в консоли, например, "Что такое замыкание в Javascript ". Внутренняя анонимная функция //main.js
function factory(){ var products = [];
for(var i=0;
i<2;
i++){ products.push(function () { console.log(i);
});
} return products;
} var soap = factory();
soap[0]();
soap[1]();
Результатом этого, например, достаточно небольшой, и равен 2.
Когда мыло soap [0] () называется переменной вне контекста, всегда 2, потому что в цикле условие ложно в i<2, следовательно, значение i равно 2, и в момент звонка вы хотите вывести значение в консоль, таким образом, она всегда пишет 2. Так же для мыла soap [1] (). Создание функции "на лету"
Можно создать завод функции - functionFactory, который выполняет задачи пользователя. Результирующая функция завода функции закрытия, по дороге в среде разработки.
var functionFactory = function(num1) {return function(num2) {return num1 * num2;
}
}
Вышеизложенное позволяет отправить номер functionFactory. Затем functionFactory возвращает короткого Замыкания, устройства памяти, значение num1. Полученная функция умножает оригинальные num1 раз значение num2, который передается при вызове.
var mult5 = functionFactory(5);
var mult10 = functionFactory(10);
Вышесказанное создает функцию mult5 и mult10. Теперь вы можете ссылаться на любой из этих ролей, переходя новый номер, который нужно умножить на 5 или 10. Теперь вы можете увидеть результат.
> mult5(3)
15
> mult5(5)
25
> mult10(3)
30
> mult10(5)
50
Цепь - одна из самых мощных функций javascript, но не может быть правильно использовано без понимания реальности. Относительно легко создать случайно, это опасно короткое замыкание в Javascript. Его создание имеет потенциально вредные последствия, особенно в некоторых относительно общих условиях в браузере. Чтобы избежать столкновения с недостатков и использования преимуществ, которые они предлагают, необходимо понять его механизм. Автор: Иван Фролов 4 Ноября 2018 года
Категория: Техника