Translation correction (#24213)

pull/34459/head
ASubjectPro 2018-11-26 18:52:28 +02:00 committed by Gregory Gubarev
parent 1f310220e2
commit d4cab4c40c
1 changed files with 32 additions and 18 deletions

View File

@ -4,7 +4,9 @@ localeTitle: Замыкания
---
# Замыкания
Замыкания представляет собой комбинацию функции и лексической среды (области), в которой была объявлена ​​эта функция. Закрытие - это фундаментальное и мощное свойство Javascript. В этой статье обсуждаются «как» и «почему» о закрытии:
Замыкание представляет собой комбинацию функции и лексического окружения (scope, область видимости), в котором была объявлена эта функция. Замыкание - это фундаментальное и мощное свойство Javascript. В этой статье обсуждаются «как» и «почему» о Замыкании:
### пример
@ -49,7 +51,9 @@ function by(propName) {
const arr_sorted = arr_.sort(by('height')); // [ { name: 'nicholas', height: 66 }, { name: 'rob', height: 70 },{ name: 'joe', height: 72 } ]
```
Замыкания «запоминает» среду, в которой она была создана. Эта среда состоит из любых локальных переменных, которые были в области видимости на момент создания замыкания.
Замыкание «запоминает» окружение, в котором оно было создано. Это окружение состоит из любых локальных переменных, которые были в области видимости на момент создания Замыкания.
```js
function outside(num) {
@ -66,11 +70,13 @@ function outside(num) {
remember2(); // This now executes the function 'inside' which console.logs(rememberedVar) => 9
```
Замыкания полезно, потому что они позволяют вам «запоминать» данные, а затем позволяют работать с этими данными через возвращаемые функции. Это позволяет javascript эмулировать частные методы, которые находятся на других языках программирования. Частные методы полезны для ограничения доступа к коду, а также для управления глобальным пространством имен.
### Частные переменные и методы
Замыкания полезны, потому что они позволяют вам «запоминать» данные, а затем позволяют работать с этими данными через возвращаемые функции. Это позволяет javascript эмулировать приватные методы, которые существуют на других языках программирования. Приватные методы полезны для ограничения доступа к коду, а также для управления глобальным пространством имен.
Закрытие также может использоваться для инкапсуляции частных данных / методов. Взгляните на этот пример:
### Приватные переменные и методы
Закрытие также может использоваться для инкапсуляции приватных данных / методов. Взгляните на этот пример:
```javascript
const bankAccount = (initialBalance) => {
@ -93,11 +99,15 @@ const bankAccount = (initialBalance) => {
account.deposit(10); // 110
```
В этом примере мы не сможем получить доступ к `balance` из любой точки вне функции `bankAccount` , а это значит, что мы только что создали приватную переменную. Где закрытие? Ну, подумайте о том, что `bankAccount()` . Он фактически возвращает объект с кучей функций внутри него, и все же, когда мы вызываем `account.getBalance()` , функция может «запомнить» свою начальную ссылку на `balance` . Это сила замыкания, когда функция «запоминает» ее лексическую область (область времени компиляции), даже если функция выполняется вне этой лексической области.
**Эмуляция переменных с блочной областью.**
В этом примере мы не сможем получить доступ к `balance` из любой точки вне функции `bankAccount` , а это значит, что мы только что создали приватную переменную. Где закрытие? Ну, подумайте о том, что возвращает`bankAccount()` . Он фактически возвращает объект с кучей функций внутри него, и все же, когда мы вызываем `account.getBalance()` , функция может «запомнить» свою начальную ссылку на `balance` . Это сила Замыкания, когда функция «запоминает» ее лексическую область (область во время компиляции), даже если функция выполняется вне этой лексической области.
**Эмуляция блочной области видимости переменных.**
В Javascript не было концепции блочной области видимости переменных. Это означает, что при определении переменной внутри forloop, например, эта переменная видима также снаружи forloop. Итак, как могут замыкания помочь нам решить эту проблему? Давайте посмотрим.
В Javascript не было понятия переменных с блочным диапазоном. Это означает, что при определении переменной внутри forloop, например, эта переменная видима также снаружи forloop. Итак, как могут замыкания помочь нам решить эту проблему? Давайте взглянем.
```javascript
var funcs = [];
@ -115,7 +125,7 @@ const bankAccount = (initialBalance) => {
}
```
Поскольку переменная i не имеет блочной области, ее значение во всех трех функциях обновлялось с помощью счетчика циклов и создавало вредоносные значения. Закрытие может помочь нам решить эту проблему, создав снимок среды, в которой была функция, когда она была создана, сохраняя ее состояние.
Поскольку переменная i не имеет блочной области видимости, ее значение во всех трех функциях обновлялось с помощью счетчика циклов и создавало неожиданные значения. Замыкание может помочь нам решить эту проблему, создав снимок окружения, в котором находилась функция, когда она была создана, сохранив ее состояние.
```javascript
var funcs = [];
@ -134,21 +144,23 @@ const bankAccount = (initialBalance) => {
}
```
В поздних версиях javascript es6 + есть новое ключевое слово, называемое let, которое может использоваться для присвоения переменной blockscope. Существует также множество функций (forEach) и целых библиотек (lodash.js), предназначенных для решения таких проблем, как те, которые были описаны выше. Они, безусловно, могут повысить вашу производительность, однако крайне важно иметь знания обо всех этих проблемах при попытке создать что-то большое.
В поздних версиях javascript es6 + есть новое ключевое слово, называемое `let` , которое может использоваться для приобретения переменной блочной области видимости. Существует также множество функций (forEach) и целых библиотек (lodash.js), предназначенных для решения таких проблем, как те, которые были описаны выше. Они, безусловно, могут повысить вашу производительность, однако крайне важно иметь знания обо всех этих проблемах при попытке создать что-то большое.
Закрытие имеет множество специальных приложений, которые полезны при создании больших javascript-программ.
Замыкание имеет множество специальных приложений, которые полезны при создании больших javascript-программ.
1. Эмуляция частных переменных или инкапсуляция
1. Эмуляция приватных переменных или инкапсуляция
2. Выполнение асинхронных вызовов на стороне сервера
3. Создание переменной с блочным диапазоном.
3. Создание переменной с блочной областью видимости.
**Эмулирование частных переменных.**
**Эмулирование приватных переменных.**
В отличие от многих других языков, Javascript не имеет механизма, который позволяет создавать инкапсулированные переменные экземпляра внутри объекта. Наличие переменных публичного экземпляра может вызвать множество проблем при построении средних и больших программ. Однако с закрытием эта проблема может быть смягчена.
В отличие от многих других языков, Javascript не имеет механизма, который позволяет создавать инкапсулированные переменные экземпляра внутри объекта. Наличие переменных публичного экземпляра может вызвать множество проблем при построении средних и больших программ. Однако с замыканием эта проблема может быть смягчена.
Как и в предыдущем примере, вы можете создавать функции, которые возвращают литералы объектов с методами, которые имеют доступ к локальным переменным объекта, не подвергая их воздействию. Таким образом, они становятся частными.
Как и в предыдущем примере, вы можете создавать функции, которые возвращают литералы объектов с методами, которые имеют доступ к локальным переменным объекта, не раскрывая их. Таким образом, они становятся приватными.
Замыкание также может помочь вам управлять глобальным пространством имен, чтобы избежать коллизий с глобально доступными данными. Обычно все глобальные переменные доступны для всех скриптов в вашем проекте, что определенно создаст вам много проблем при создании средних и больших программ. Вот почему авторы библиотек и модулей используют замыкание, чтобы полностью скрыть методы и данные модуля. Это называется шаблоном модуля, он использует немедленно вызываемые функции, которые экспортируют только определенный функционал во внешний мир, что значительно сокращает количество глобальных ссылок.
замыкания также может помочь вам управлять глобальным пространством имен, чтобы избежать столкновений с глобально разделяемыми данными. Обычно все глобальные переменные распределяются между всеми сценариями в вашем проекте, что определенно даст вам много проблем при создании средних и больших программ. Вот почему библиотеки и авторы модулей используют закрытие, чтобы скрыть методы и данные всего модуля. Это называется шаблоном модуля, он использует выражение, вызываемое непосредственно вызываемым, которое экспортирует только определенные функции во внешний мир, что значительно сокращает количество глобальных ссылок.
Вот краткий образец скелета модуля.
@ -169,7 +181,9 @@ var myModule = (function() = {
myModule.method2(); // I am method 2, I am a private variable
```
замыкания полезно для захвата новых экземпляров частных переменных, содержащихся в «запоминаемой» среде, и к этим переменным можно получить доступ только через возвращаемую функцию или методы.
Замыкание полезно для захвата новых экземпляров приватных переменных, содержащихся в «запоминаемом» окружении, и к этим переменным можно получить доступ только через возвращаемые функцию или методы.
### Дополнительная информация: