`Область видимости` описывает множество переменных, объектов, а также функций, к которым есть непосредственный доступ.

JavaScript обладает двумя областями видимости: `глобальной` и `локальной`. Переменная, объявленная снаружи функции, является `глобальной` переменной. Она доступна и изменяема из любого места вашей программы. При объявлении переменной внутри функции мы получаем `локальную` переменную. Она создаётся и удаляется каждый раз при вызове функции. К такой переменной нельзя получить доступ извне функции.

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

Обратите внимание на комментарии к приведённому ниже коду:

```js
const a = 4 // это глобальная переменная, она доступна для функций ниже

function foo () {
  const b = a * 3 // к переменной `b` нет доступа снаружи функции `foo`, но к
  // этой переменной имеют доступ функции, объявленные внутри `foo`
  function bar (c) {
    const b = 2 // ещё одна переменная `b` создана внутри области видимости
    // функции `bar`, модификации этой новой переменной `b` никак не
    // отразятся на объявленной выше переменной `b`
    console.log(a, b, c)
  }

  bar(b * 4)
}

foo() // 4, 2, 48
```

Непосредственно выполняемая функция-выражение (IIFE) -- распространённый паттерн создания локальной области видимости.

Например:

```js
(function () { // объявление функции окружено круглыми скобками
  // переменные, объявленные здесь,
  // не будут доступны снаружи
})() // функция сразу же вызывается
```

## Условия задачи

Создайте файл `scope.js`.

Скопируйте в него следующий код:

```js
const a = 1; const b = 2; const c = 3;

(function firstFunction () {
  const b = 5; const c = 6;

  (function secondFunction () {
    const b = 8;

    (function thirdFunction () {
      const a = 7; const c = 9;

      (function fourthFunction () {
        const a = 1; const c = 8
      })()
    })()
  })()
})()
```

Используя полученные знания об `областях видимости`, разместите приведённый ниже код внутри одной из функций, объявленных в `scope.js` так, чтобы на выходе получилось `a: 1, b: 8, c: 6`.

```js
console.log(`a: ${a}, b: ${b}, c: ${c}`);
```

Чтобы удостовериться в правильности решения задачи, запустите следующую команду из терминала:

```bash
javascripting verify scope.js
```
