committed by
Gregory Gubarev
parent
7f164bdcf6
commit
f92c3b0aa5
@ -5,6 +5,7 @@ localeTitle: Замыкания
|
||||
# Замыкания
|
||||
|
||||
|
||||
|
||||
Замыкание представляет собой комбинацию функции и лексического окружения (scope, область видимости), в котором была объявлена эта функция. Замыкание - это фундаментальное и мощное свойство Javascript. В этой статье обсуждаются «как» и «почему» о Замыкании:
|
||||
|
||||
|
||||
@ -51,10 +52,8 @@ 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) {
|
||||
var rememberedVar = num; // In this example, rememberedVar is the lexical environment that the closure 'remembers'
|
||||
@ -71,12 +70,12 @@ function outside(num) {
|
||||
```
|
||||
|
||||
|
||||
Замыкания полезны, потому что они позволяют вам «запоминать» данные, а затем позволяют работать с этими данными через возвращаемые функции. Это позволяет javascript эмулировать приватные методы, которые существуют на других языках программирования. Приватные методы полезны для ограничения доступа к коду, а также для управления глобальным пространством имен.
|
||||
|
||||
Замыкания полезны, потому что они позволяют вам «запоминать» данные, а затем позволяют работать с этими данными через возвращаемые функции. Это позволяет javascript имитировать приватные методы, которые есть в других языках программирования. Приватные методы полезны для ограничения доступа к коду, а также для управления глобальным пространством имен.
|
||||
|
||||
### Приватные переменные и методы
|
||||
|
||||
Закрытие также может использоваться для инкапсуляции приватных данных / методов. Взгляните на этот пример:
|
||||
Замыкание также может использоваться для инкапсуляции приватных данных / методов. Взгляните на этот пример:
|
||||
|
||||
|
||||
```javascript
|
||||
const bankAccount = (initialBalance) => {
|
||||
@ -100,6 +99,7 @@ const bankAccount = (initialBalance) => {
|
||||
```
|
||||
|
||||
|
||||
|
||||
В этом примере мы не сможем получить доступ к `balance` из любой точки вне функции `bankAccount` , а это значит, что мы только что создали приватную переменную. Где закрытие? Ну, подумайте о том, что возвращает`bankAccount()` . Он фактически возвращает объект с кучей функций внутри него, и все же, когда мы вызываем `account.getBalance()` , функция может «запомнить» свою начальную ссылку на `balance` . Это сила Замыкания, когда функция «запоминает» ее лексическую область (область во время компиляции), даже если функция выполняется вне этой лексической области.
|
||||
|
||||
|
||||
@ -108,7 +108,6 @@ const bankAccount = (initialBalance) => {
|
||||
|
||||
В Javascript не было концепции блочной области видимости переменных. Это означает, что при определении переменной внутри forloop, например, эта переменная видима также снаружи forloop. Итак, как могут замыкания помочь нам решить эту проблему? Давайте посмотрим.
|
||||
|
||||
|
||||
```javascript
|
||||
var funcs = [];
|
||||
|
||||
@ -125,8 +124,10 @@ const bankAccount = (initialBalance) => {
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
Поскольку переменная i не имеет блочной области видимости, ее значение во всех трех функциях обновлялось с помощью счетчика циклов и создавало неожиданные значения. Замыкание может помочь нам решить эту проблему, создав снимок окружения, в котором находилась функция, когда она была создана, сохранив ее состояние.
|
||||
|
||||
|
||||
```javascript
|
||||
var funcs = [];
|
||||
|
||||
@ -144,6 +145,7 @@ const bankAccount = (initialBalance) => {
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
В поздних версиях javascript es6 + есть новое ключевое слово, называемое `let` , которое может использоваться для приобретения переменной блочной области видимости. Существует также множество функций (forEach) и целых библиотек (lodash.js), предназначенных для решения таких проблем, как те, которые были описаны выше. Они, безусловно, могут повысить вашу производительность, однако крайне важно иметь знания обо всех этих проблемах при попытке создать что-то большое.
|
||||
|
||||
Замыкание имеет множество специальных приложений, которые полезны при создании больших javascript-программ.
|
||||
@ -181,7 +183,6 @@ var myModule = (function() = {
|
||||
myModule.method2(); // I am method 2, I am a private variable
|
||||
```
|
||||
|
||||
|
||||
Замыкание полезно для захвата новых экземпляров приватных переменных, содержащихся в «запоминаемом» окружении, и к этим переменным можно получить доступ только через возвращаемые функцию или методы.
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user