> For the complete documentation index, see [llms.txt](https://strctr.gitbook.io/programming/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://strctr.gitbook.io/programming/01-languages/javascript/01-language/c-functions/c1-functions/03.iii-function-closure.md).

# 03.iii Function Closure

Функция в момент своего определения сохраняет ссылку на внешнее пространство имен в котором объявлена (На самом деле на всю цепочку внешних пространств, если их больше одного). Переменные, определенные во внешней области видимости будут доступны для использования внутри функции.

Такая комбинация объекта функции и внешнего пространства имен (где находятся внешние переменные используемые функцией) называется **замыканием**. Замыкание означает, что функция всегда сохраняет связь с внешней областью видимости неважно где и когда она вызывается..

```javascript
var scope = "global scope"; // Глобальная переменная
function checkscope() {
  var scope = "local scope"; // Локальная переменная
  function f() {
    return scope;
  } // Вернет значение локальной переменной scope
  return f();
}
checkscope(); // => local scope
```

Особую популярность этот прием получил когда одна функция порождает другую. В этом случая возвращаемая функция замкнет у себя и пространство имен внешней функции и глобальное пространство имен:

```javascript
function createInc(startValue) {
  return function(step) {
    startValue += step;
    return startValue;
  };
}

const inc = createInc(5);
inc(1); // 6
inc(2); // 8
```
