<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/"
    xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" version="2.0">
    <channel>
        
        <title>
            <![CDATA[ Ihor Lysak - freeCodeCamp.org ]]>
        </title>
        <description>
            <![CDATA[ Browse thousands of programming tutorials written by experts. Learn Web Development, Data Science, DevOps, Security, and get developer career advice. ]]>
        </description>
        <link>https://www.freecodecamp.org/ukrainian/news/</link>
        <image>
            <url>https://cdn.freecodecamp.org/universal/favicons/favicon.png</url>
            <title>
                <![CDATA[ Ihor Lysak - freeCodeCamp.org ]]>
            </title>
            <link>https://www.freecodecamp.org/ukrainian/news/</link>
        </image>
        <generator>Eleventy</generator>
        <lastBuildDate>Sun, 07 Jun 2026 04:51:21 +0000</lastBuildDate>
        <atom:link href="https://www.freecodecamp.org/ukrainian/news/author/ihor-lysak/rss.xml" rel="self" type="application/rss+xml" />
        <ttl>60</ttl>
        
            <item>
                <title>
                    <![CDATA[ Лексична область в JavaScript: що таке область в JS? ]]>
                </title>
                <description>
                    <![CDATA[ Термін «лексична область» на перший погляд може здатися неочевидним. Корисно було б розібрати значення цих слів окремо. Ця стаття пояснить лексичну область, спершу розібравши значення слів «лексична» та «область». Давайте почнемо з розбору значення слова «область». Що ж таке область? Область — це простір, в якому предмет (функція або змінна) ]]>
                </description>
                <link>https://www.freecodecamp.org/ukrainian/news/leksychna-oblast-v-javascript-shcho-take-oblast-v-js/</link>
                <guid isPermaLink="false">64c93fdaae608205b21f6c88</guid>
                
                    <category>
                        <![CDATA[ JavaScript ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Ihor Lysak ]]>
                </dc:creator>
                <pubDate>Thu, 03 Aug 2023 08:22:55 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/ukrainian/news/content/images/2023/08/kristina-tripkovic-EGmwwDzme6s-unsplash-javascript-lexical-scope-codesweetly.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Оригінальна публікація:</strong> <a href="https://www.freecodecamp.org/news/javascript-lexical-scope-tutorial/#what-is-a-scope-chain" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">Lexical Scope in JavaScript – What Exactly Is Scope in JS?</a>
      </p><p>Термін <strong>«лексична область» </strong>на перший погляд може здатися неочевидним. Корисно було б розібрати значення цих слів окремо.</p><p>Ця стаття пояснить лексичну область, спершу розібравши значення слів «лексична» та «область».</p><p>Давайте почнемо з розбору значення слова «область».</p><h2 id="-"><strong>Що ж таке область?</strong></h2><p><strong>Область </strong>— це <em>простір</em>,<em> </em>в якому предмет (функція або змінна) є видимим та доступним для решти <a href="https://codesweetly.com/document-vs-data-vs-code/">коду</a>.</p><p><strong>Зверніть увагу:</strong></p><ul><li><strong>Область </strong>— це територія, простір або регіон.</li><li><strong>Глобальна область</strong> — це глобальний простір (або публічний).</li><li><strong>Локальна область</strong> — це місцевий простір (або обмежений).</li></ul><p><strong>Ось приклад:</strong></p><pre><code class="language-js">// Визначення змінної в глобальній області:
const fullName = "Oluwatobi Sofela";

// Визначення вкладених функцій:
function profile() {
  function sayName() {
    function writeName() {
      return fullName;
    }
    return writeName();
  }
  return sayName();
}</code></pre><p><a href="https://stackblitz.com/edit/web-platform-fqqxjl?file=script.js"><strong>Спробуйте на StackBlitz</strong></a></p><p>У фрагменті вище ми визначили змінну <code>fullName</code> в глобальній області. Через це вона є видимою та доступною глобально всьому коду всередині цього скрипту.</p><p>Але ми визначили <code>writeName()</code> всередині функції <code>sayName()</code>, тому <code>writeName()</code> перебуває в локальній області <code>sayName()</code>.</p><p>Не забувайте, що кожен раз, коли ми викликаємо функцію <code>writeName()</code>, комп’ютер <em>не</em> піде до глобальної області, щоб викликати змінну <code>fullName</code>. Натомість, він послідовно пройде через ланцюг областей, шукаючи <code>fullName</code>.</p><h2 id="--1"><strong>Що таке ланцюг областей?</strong></h2><p><strong>Ланцюгом областей </strong>називають <em>унікальні </em>простори, які існують поза областю, де змінну <em>викликали </em>до глобальної області.</p><p><strong>Для прикладу:</strong></p><pre><code class="language-js">// Визначення змінної в глобальній області:
const fullName = "Oluwatobi Sofela";

// Визначення вкладених функцій:
function profile() {
  function sayName() {
    function writeName() {
      return fullName;
    }
    return writeName();
  }
  return sayName();
}</code></pre><p>Зверніть увагу, в фрагменті вище змінна <code>fullName</code> була викликана з області функції <code>writeName()</code>.</p><p>Тому ланцюг областей, який існує від виклику змінної до глобальної області, виглядатиме так:</p><p><strong>Область writeName() ---&gt; область sayName() ---&gt; область profile() ---&gt; глобальна область</strong></p><p>Іншими словами, від області виклику змінної <code>fullName</code> до її лексичної області (в даному випадку <em>глобальної області</em>) знаходяться чотири інших областей.</p><p><strong>Зверніть увагу: </strong>глобальна область є останньою ланкою в ланцюгу областей <a href="https://www.codesweetly.com/html-css-javascript/">JavaScript</a>.</p><h2 id="--2"><strong>Як працює ланцюг областей?</strong></h2><p>Ланцюг областей JavaScript визначає ієрархію областей, через які має пройти комп’ютер, щоб знайти лексичну область конкретної функції, яка була викликана.</p><p>Для прикладу розглянемо такий код:</p><pre><code class="language-js">// Визначення змінної в глобальній області:
const fullName = "Oluwatobi Sofela";

// Визначення вкладених функцій:
function profile() {
  function sayName() {
    function writeName() {
      return fullName;
    }
    return writeName();
  }
  return sayName();
}</code></pre><p>У фрагменті вище, кожен раз при виклику функції <code>profile()</code>, комп’ютер спочатку викликатиме функцію <code>sayName()</code>, яка є єдиним кодом всередині функції <code>profile()</code>.</p><p>Після цього комп’ютер викликатиме функцію <code>writeName()</code>, яка є єдиним кодом всередині функції <code>sayName()</code>.</p><p>Тепер, оскільки код всередині <code>writeName()</code> каже комп’ютеру викликати та повернути вміст змінної <code>fullName</code>, комп’ютер викличе <code>fullName</code>. Але комп'ютер не піде напряму до глобальної області, щоб викликати <code>fullName</code>.</p><p>Натомість комп’ютер <em>крок за кроком</em> проходить через <em>ланцюг областей, </em>щоб знайти <em>лексичну область </em>змінної <code>fullName</code>.</p><p>Ось послідовність кроків, які має зробити комп’ютер, щоб знайти лексичну область змінної <code>fullName</code>:</p><ol><li>Комп’ютер провірить, чи змінна <code>fullName</code> була визначена локально всередені функції <code>writeName()</code>. Але він не знайде визначення <code>fullName</code> тут, тому він рухається до наступної області, щоб продовжити свої пошуки.</li><li>Комп’ютер шукатиме визначення <code>fullName</code> всередині <code>sayName()</code> (це наступна область в ланцюгу). Він не знайде визначення змінних тут, тому далі рухається вверх по ланцюгу.</li><li>Комп’ютер шукатиме визначення <code>fullName</code> у функції <code>profile()</code>. Визначення <code>fullName</code> тут немає. Комп’ютер далі шукає лексичну область змінної <code>fullName</code> в наступній частині ланцюга областей.</li><li>Комп’ютер доходить до <em>глобальної області</em> (наступна область після <code>profile()</code>). На щастя, він знаходить визначення <code>fullName</code>! Як наслідок, комп’ютер отримає вміст змінної (<code>"Oluwatobi Sofela"</code>) і поверне його.</li></ol><h2 id="--3"><strong>Час попрактикуватися з областю 🤸‍♂️🏋️‍♀️🏊‍♀️</strong></h2><p>Розглянемо код. Яку з трьох змінних <code>fullName</code> викличе комп’ютер?</p><pre><code class="language-js">// Спочатку змінна fullName визначається в глобальній області:
const fullName = "Oluwatobi Sofela";

// Вкладені функції, які містять ще дві змінні fullName:
function profile() {
  const fullName = "Tobi Sho";
  function sayName() {
    const fullName = "Oluwa Sofe";
    function writeName() {
      return fullName;
    }
    return writeName();
  }
  return sayName();
}</code></pre><p>Комп’ютер викличе першу, другу чи третю змінну <code>fullName</code>?</p><p><strong>Зверніть увагу: </strong>ви візьмете від цієї статті набагато більше, якщо випробуєте надані приклади на власній практиці.</p><p>Якщо у вас не буде виходити, не засмучуйтесь. Натомість, перегляньте урок та спробуйте ще раз.</p><p>Продовжуйте лише після того, як виклались на всі сто (якщо ви змухлюєте або проігноруєте цей крок, ви зробите гірше для себе!).</p><h2 id="--4"><strong>Впоралися?</strong></h2><p>Серед трьох визначень <code>fullName</code>, що представлені в коді вище, комп’ютер викличе та поверне ту змінну, яка визначена у функції <code>sayName()</code>.</p><p>Змінна <code>fullName</code> всередині <code>sayName()</code> буде викликана, тому що <code>sayName()</code> є першою областю, в якій комп’ютер знайде визначення <code>fullName</code>.</p><p>Тому, якщо викликати <code>profile()</code>, поверненим значенням буде <code>"Oluwa Sofe"</code>.</p><p><strong><a href="https://stackblitz.com/edit/web-platform-9mpvfv?file=script.js">Спробуйте на StackBlitz</a></strong></p><p><strong>Запам’ятайте:</strong></p><ul><li>Уявімо, що комп’ютер не знайде визначення <code>fullName</code> у жодній області. В такому випадку комп’ютер поверне <code>Uncaught ReferenceError: fullName is not defined</code>.</li><li>Глобальна область завжди є останньою в ланцюгу областей. Іншими словами, глобальна область — це те місце, де закінчуються всі пошуки.</li><li>Внутрішня область (нащадок) має доступ до батьківської (зовнішньої) області, але зовнішня область не має доступу до області-нащадка. Наприклад, у фрагменті вище функція <code>writeName()</code> має доступ до коду всередині будь-якої батьківської області (<code>sayName()</code>, <code>profile()</code> або <em>глобальної області</em>). Однак <code>sayName()</code>, <code>profile()</code> та <em>глобальна область</em> не мають доступу до коду всередині <code>writeName()</code>.</li></ul><h2 id="--5"><strong>Швидкий огляд того, що ми вивчили</strong></h2><p>Область в JavaScript — це про простір.</p><p>Тому наступного разу, коли партнер запрошує вас у свою особисту область, пам’ятайте, що вони запрошують вас у свій особистий простір 😜!</p><p>Коли прибудете туди, не забудьте попросити їх продемонструвати лексичні вміння...</p><p>Ви питаєте, що означає «лексичний»? Давайте розберемося.</p><h2 id="--6"><strong>Що означає «лексичний»?</strong></h2><p><strong>Лексичний </strong>—<strong> </strong>це про визначення речей.</p><p>Все, що пов’язано зі створенням слів, виразів або змінних, є <em>лексичним</em>.</p><p>Наприклад, гра <a href="https://uk.wikipedia.org/wiki/Скрабл">scrabble</a> є лексичною активністю, оскільки вона пов’язана зі створенням слів.</p><p>Також особа, робота якої пов’язана з лінгвістикою (дослідженням мов), має лексичну кар’єру.</p><p><strong>Зверніть увагу: </strong>другою назвою словника є <em>лексикон</em>. Іншими словами, лексикон — це словник, в якому перераховані та визначені слова.</p><p>Тепер, коли ми розуміємо значення слів «лексична» та«область», ми можемо говорити про <strong>лексичну область</strong>.</p><h2 id="-javascript"><strong>Що таке лексична область в JavaScript?</strong></h2><p><strong>Лексична область</strong> — це область <em>визначення</em> виразу.</p><p>Іншими словами, лексична область предмету — це місце, в якому предмет було <em>створено.</em></p><p><strong>Зверніть увагу:</strong></p><ul><li>Інакшою назвою для лексичної області є <em>статична область</em>.</li><li>Місце, де предмет був викликаним, не завжди є лексичною областю предмета. Натомість <em>область визначення </em>предмету є його лексичною областю.</li></ul><h3 id="--7"><strong>Приклад лексичної області:</strong></h3><p>Розглянемо такий код:</p><pre><code class="language-js">// Визначення змінної в глобальній області:
const myName = "Oluwatobi";

// Виклик змінної myName всередині функції:
function getName() {
  return myName;
}</code></pre><p>Зверніть увагу, що у наведеному фрагменті ми <em>визначили </em>змінну <code>myName</code> в глобальній області та <em>викликали </em>її всередині функції <code>getName()</code>.</p><p><strong>Питання: </strong>який з двох просторів є лексичною областю змінної <code>myName</code>? Це <em>глобальна область<strong> </strong></em>чи локальна область функції <code>getName()</code>?</p><p><strong>Відповідь:</strong> не забувайте, що <em>лексична область — </em>це <em>простір визначення</em>, а не <em>простір виклику</em>. Тому лексичною областю змінної <code>myName</code> є <em>глобальна область, </em>оскільки ми визначили <code>myName</code> в глобальному середовищі.</p><h3 id="--8"><strong>Ще один приклад лексичної області</strong></h3><pre><code class="language-js">function getName() {
  const myName = "Oluwatobi";
  return myName;
}</code></pre><p><strong>Питання:</strong> де знаходиться лексична область <code>myName</code>?</p><p><strong>Відповідь: </strong>зверніть увагу, що ми створили та викликали змінну <code>myName</code> всередині <code>getName()</code>. Тому лексичною областю <code>myName</code> є локальне серидовище <code>getName()</code>, оскільки <code>getName()</code> є простором визначення <code>myName</code>.</p><h2 id="--9"><strong>Як працює лексична область?</strong></h2><p>Область визначення виразу JavaScript визначає, який код має доступ до нього.</p><p>Іншими словами, лише код всередині лексичної області предмету має доступ до цього предмету.</p><p>Наприклад, розглянемо такий код:</p><pre><code class="language-js">// Визначення функції:
function showLastName() {
  const lastName = "Sofela";
  return lastName;
}

// Визначення іншої функції:
function displayFullName() {
  const fullName = "Oluwatobi " + lastName;
  return fullName;
}

// Виклик функції displayFullName():
console.log(displayFullName());

// Виклик функції вище поверне:
Uncaught ReferenceError: lastName is not defined</code></pre><p>Зверніть увагу, що виклик функції <code>displayFullName()</code> у фрагменті вище повернув <code>Uncaught ReferenceError</code>. Помилка повертається, бо лише код всередині лексичної області предмету може мати доступ до предмету.</p><p>Як наслідок, ані функція <code>displayFullName()</code>, ані її внутрішній код не мають доступу до змінної <code>lastName</code>, оскільки <code>lastName</code> була визначена в іншій області.</p><p>Іншими словами, лексична область змінної <code>lastName</code> відрізняється від області змінної <code>displayFullName()</code>.</p><p>Простір визначення <code>lastName</code> знаходиться у <code>showLastName()</code>, якщо лексична область <code>displayFullName()</code> — це глобальне серидовище.</p><p>Тепер розглянемо інший код:</p><pre><code class="language-js">// Визначення функції:
function showLastName() {
  const lastName = "Sofela";
  return lastName;
}

// Визначення іншої функції:
function displayFullName() {
  const fullName = "Oluwatobi " + showLastName();
  return fullName;
}

// Виклик функції displayFullName():
console.log(displayFullName());

// Виклик функції вище поверне:
"Oluwatobi Sofela"</code></pre><p>У фрагменті вище <code>displayFullName()</code> успішно повернула <code>"Oluwatobi Sofela"</code>, оскільки <code>displayFullName()</code> та <code>showLastName()</code> знаходяться в одній лексичній області.</p><p>Іншими словами, <code>displayFullName()</code> може викликати <code>showLastName()</code>, бо обидві функції визначено в глобальній області.</p><p><strong>Зверніть увагу:</strong></p><ul><li>У другому прикладі <code>displayFullName()</code> не отримала доступу до змінної <code>lastName</code> всередині <code>showLastName()</code>. Натомість <code>displayFullName()</code> викликала <code>showLastName()</code>, яка потім повернула вміст змінної <code>lastName</code>.</li><li>Альтернативою лексичої області є динамічна область, але вона рідко використовується в програмуванні. Лише декілька мов, наприклад bash, використовують динамічну область.</li></ul><h2 id="--10"><strong>Висновок</strong></h2><p>Кожен раз, коли ви чуєте «лексична», думайте про визначення.</p><p>Тобто лексична область машини, змінної, телефону, функції або купальника — це місце походження.</p><h2 id="--11"><strong>Огляд</strong></h2><p>У цій статті описано лексичну область в <a href="https://www.codesweetly.com/html-css-javascript/">JavaScript</a>. Також пояснено, чому це важливе поняття в програмуванні.</p><p>Дякую за увагу!</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Лексична область в JavaScript: довідник початківця ]]>
                </title>
                <description>
                    <![CDATA[ У цій статті ми дізнаємось, що таке лексична область видимості, розглянувши декілька корисних прикладів. Також ми обговоримо, яким чином JavaScript компілює та виконує програми. Вкінці ми поговоримо про те, яким чином можна використовувати лексичну область для пояснення помилок неоголошених змінних чи посилання. Без зайвих слів, почнемо. Зміст  * Як ]]>
                </description>
                <link>https://www.freecodecamp.org/ukrainian/news/leksychna-oblast-v-javascript-dovidnyk-pochatkivtsya/</link>
                <guid isPermaLink="false">64c7d821ae608205b21f664e</guid>
                
                    <category>
                        <![CDATA[ JavaScript ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Ihor Lysak ]]>
                </dc:creator>
                <pubDate>Tue, 01 Aug 2023 11:17:07 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/ukrainian/news/content/images/2023/08/spacex--p-KCm6xB9I-unsplash-1.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Оригінальна публікація:</strong> <a href="https://www.freecodecamp.org/news/lexical-scope-in-javascript/#syntax-error" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">Lexical Scope in JavaScript – Beginner's Guide</a>
      </p><p>У цій статті ми дізнаємось, що таке лексична область видимості, розглянувши декілька корисних прикладів.</p><p>Також ми обговоримо, яким чином JavaScript компілює та виконує програми.</p><p>Вкінці ми поговоримо про те, яким чином можна використовувати лексичну область для пояснення помилок неоголошених змінних чи посилання.</p><p>Без зайвих слів, почнемо.</p><h2 id="-"><strong>Зміст</strong></h2><ul><li><a href="#як-javascript-виконує-програми">Як JavaScript виконує програми?</a></li><li><a href="#як-javascript-парсить-компілює-та-виконує-код">Як JavaScript парсить/компілює та виконує код</a></li><li><a href="#синтаксична-помилка">Розуміння помилки синтаксису</a></li><li><a href="#піднесення-змінних-та-функцій">Розуміння піднесення змінних та функцій</a></li><li><a href="#що-таке-лексична-область">Що таке лексична область?</a></li><li><a href="#розуміння-лексичної-області">Розуміння лексичної області</a></li><li><a href="#підсумки">Підсумки</a></li></ul><!--kg-card-begin: html--><h2 id="як-javascript-виконує-програми">Як JavaScript виконує програми?</h2><!--kg-card-end: html--><p>Перед тим як розбиратися, як JavaScript виконує код/програму, ми розглянемо різні кроки, що залучені у будь-якому процесі компіляції з точки зору теорії компілятора.</p><p>Для будь-якої мови компілятор виконує такі операції:</p><h3 id="--1"><strong>Токенізація/лексування</strong></h3><p>Під час цього процесу вся програма розділяється на ключові слова, які називаються токенами. Наприклад, розглянемо інструкцію <code>let temp = 10</code>: коли виконується токенізація, вона ділить інструкцію на такі ключові слова: <code>let</code>, <code>temp</code>, <code>=</code>, <code>10</code>.</p><p>Лексування та токенізація є взаємозамінними термінами, але між ними є невелика різниця. Лексування — це процес токенізації, який також перевіряє, чи він сам має розглядатися як окремий токен. Ми можемо вважати <strong>лексування «</strong>розумною» версією токенізації.</p><h3 id="--2"><strong>Парсинг</strong></h3><p>Це процес збирання всіх токенів, згенерованих під час попереднього кроку та їх перетворення у структуру вкладеного дерева, що представляє код з граматичної точки зору.</p><p>Цю структуру дерева називають абстрактним синтаксичним деревом (AST).</p><h3 id="--3"><strong>Генерування коду</strong></h3><p>Цей процес конвертує AST у код, який може прочитати машина.</p><p>Це був короткий огляд того, як компілятор працює та генерує машинний код.</p><p>Звісно, в компіляції є більше кроків ніж описано вище, але опис інших кроків компіляції знаходиться поза темою цієї статті.</p><p>Найважливішим спостереженням щодо виконання коду JavaScript є той факт, що в межах виконання коду відбуваються дві фази:</p><ol><li>Парсинг</li><li>Виконання</li></ol><p>Перед тим, як ми перейдемо до лексичної області, важливо розуміти, як JavaScript виконує програму. У наступному розділі ми детальніше розберемо, як працюють ці дві фази.</p><!--kg-card-begin: html--><h2 id="як-javascript-парсить-компілює-та-виконує-код">Як JavaScript парсить/компілює та виконує код</h2><!--kg-card-end: html--><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2022/05/Untitled.png" class="kg-image" alt="Untitled" width="600" height="400" loading="lazy"><figcaption>Фаза парсингу</figcaption></figure><p>Спочатку обговоримо фазу парсингу. Під час цієї фази двигун JavaScript оглядає всю програму, призначає змінні до відповідних областей та перевіряє наявність помилок. Якщо він знаходить помилку, виконання програми зупиняється.</p><p>Під час наступної фази відбувається виконання коду.</p><p>Для того, щоб краще зрозуміти цей процес, розглянемо детальніше два сценарії:</p><ul><li>Синтаксична помилка</li><li>Піднесення змінної</li></ul><!--kg-card-begin: html--><h3 id="синтаксична-помилка">Синтаксична помилка</h3><!--kg-card-end: html--><p>Найкращий та найпростіший спосіб показати, як JS спочатку парсить, а потім виконує програму, — показати поведінку синтаксичної помилки.</p><p>Розглянемо такий помилковий код:</p><pre><code class="language-javascript">const token = "ABC";
console.log(token);

//Синтаксична помилка:
const newToken = %((token);</code></pre><p>Програма вище видасть синтаксичну помилку в останньому рядку. Помилка буде виглядати ось так:</p><pre><code class="language-javascript">Uncaught SyntaxError: Unexpected token '%'
</code></pre><p>JavaScript не виконує <code>console.log</code>. Натомість він проходить через всю програму наступним чином:</p><ul><li>Рядок 1: знайдено оголошення та визначення змінної. Збережено посилання на змінну <code>token</code> в поточній області, яка є глобальною.</li><li>Рядок 2: двигун JavaScript побачив, що змінна <code>token</code> використовується. Спочатку він звертається до поточної області з метою перевірити, чи присутня змінна <code>token</code>. Якщо вона присутня, то посилається на оголошення змінної <code>token</code>.</li><li>Рядок 3: двигун побачив, що змінна <code>newToken</code> була оголошена та визначена. Він перевірив, чи змінна під назвою <code>newToken</code> вже існувала у поточній області. Якщо так, двигун видає помилку посилання. Якщо ні, двигун зберігає посилання на цю змінну в поточній області.</li><li>У тому ж рядку двигун побачив, що він намагався посилатися на змінну <code>%((token)</code>. Також він помітив, що назва почалася з символу <code>%</code>, а назви змінних не можуть починатися з резервованих ключових слів, тому двигун видав синтаксичну помилку.</li></ul><!--kg-card-begin: html--><h3 id="піднесення-змінних-та-функцій">Піднесення змінних та функцій</h3><!--kg-card-end: html--><p>Піднесення — це механізм, завдяки якому всі змінні у своїх відповідних областях «підіймаються», тобто стають доступними зверху.</p><p>Поглянемо на приклад нижче, який покаже, що піднесення відбувається під час фази парсингу і потім відбувається виконання:</p><pre><code class="language-javascript">doSomething();

function doSomething(){
	console.log("How you doing?");
}</code></pre><p>В прикладі вище, двигун проходить всю програму у такій послідовності:</p><ul><li>Рядок 1: двигун JavaScript потрапив нa функцію під назвою <code>doSomething</code>. Він перевірив, чи <code>doSomething</code> доступна в поточній області. Якщо так, він посилається на функцію, в інакшому випадку він видає помилку посилання.</li><li>Виявилось, що під час фази парсину двигун знайшов <code>function doSomething</code> у поточній області. Як наслідок, він додав посилання на змінну в поточну область та зробив її доступною в межах всієї програми.</li><li>Вкінці функція <code>doSomething</code> друкує рядок <code>How you doing?</code>.</li></ul><p>Виходячи з пояснення вище, спочатку код парсувався, щоб згенерувати проміжний код, який забезпечує доступ до посилання на змінні та функції в поточній області.</p><p>В наступній фазі JavaScript знає про існування функції та починає її виконувати.</p><p>З прикладів наведених вище, ми можемо впевнено дійти до висновку, що двигун JavaScript робить наступні кроки перед виконанням коду:</p><ol><li>Парсить код.</li><li>Генерує проміжний код, що описує доступні змінні та функції.</li><li>Використовуючи цей проміжний код, двигун починає виконання програми.</li></ol><!--kg-card-begin: html--><h2 id="що-таке-лексична-область">Що таке лексична область?</h2><!--kg-card-end: html--><p>Процес визначення областей змінних та функцій під час виконання називається лексичною областю. Слово <em>лексична </em>походить від <em>лексичної фази/фази токенізації </em>компіляції JavaScript.</p><p>Протягом часу виконання JavaScript робить дві дії: <code>парсинг</code> та <code>виконання</code>. Як ми дізналися в попередньому розділі, під час фази парсингу визначаються області змінних та функцій. Тому й було важливо спочатку зрозуміти, як працює фаза парсингу у виконанні коду, оскільки вона закладає фундамент для розуміння лексичної області.</p><p>Простими словами, під час фази парсингу відбувається створення лексичної області.</p><p>Тепер, коли ми знаємо основи, розглянемо основні характеристики лексичної області:</p><p>По-перше, під час фази парсингу, область призначається/посилається на змінну там, де вона оголошена. </p><p>Наприклад, розглянемо сценарій, коли змінна згадується у внутрішній функції, а її оголошення знаходиться в глобальній області. У цьому випадку внутрішня змінна призначена з зовнішньою областю, що є глобальною областю.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2022/05/ezgif.com-gif-maker--1---1-.gif" class="kg-image" alt="ezgif.com-gif-maker--1---1-" width="600" height="400" loading="lazy"><figcaption>Ілюстрація призначення області</figcaption></figure><p>Потім, під час призначення області до змінної, двигун JavaScript перевіряє батьківські області на наявність змінної.</p><p>Якщо змінна присутня, батьківська область застосовується до змінної. Якщо змінна не знайдена в цих областях, двигун видає помилку посилання.<br><br>Поглянемо на ілюстрацію знизу, яка показує, як відбувається пошук області змінної.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2022/05/ezgif.com-gif-maker--3---1-.gif" class="kg-image" alt="ezgif.com-gif-maker--3---1-" width="600" height="400" loading="lazy"><figcaption>Двигун JS успішно знаходить змінну, проглядаючи кожну область</figcaption></figure><p>А ця ілюстрація показує, як двигун JS намагається знайти змінну, яка не існує в жодній області:</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2022/05/ezgif.com-gif-maker--6---1-.gif" class="kg-image" alt="ezgif.com-gif-maker--6---1-" width="600" height="400" loading="lazy"><figcaption>Двигун JS видає помилку посилання</figcaption></figure><!--kg-card-begin: html--><h2 id="розуміння-лексичної-області">Розуміння лексичної області</h2><!--kg-card-end: html--><p>У розділі вище ми дали визначення лексичній області. Також ми розібралися з її характеристиками.</p><p>У цьому розділі ми розглянемо лексичну область на прикладі. Як то кажуть, складні теми завжди легше зрозуміти на реальних прикладах.</p><p>Приклад, який ми розглянемо, полягає у забарвленні часток коду, які мають схожі області. Звучить незрозуміло, але дозвольте продемонструвати простою ілюстрацією.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2022/05/Global-and-Functional-Scope--1---1-.gif" class="kg-image" alt="Global-and-Functional-Scope--1---1-" width="600" height="400" loading="lazy"><figcaption>Поняття лексичної області за допомогою кольорового прикладу</figcaption></figure><p>Розберемо, що відбувається на цій ілюстрації.</p><p>У нашій програмі знаходяться:</p><ul><li><code>empData</code>: масив об’єктів.</li><li><code>allPositions</code>: масив рядків що описує посади працівників.</li><li>Інструкція, яка друкує змінні <code>allPositions</code>.</li></ul><p>Тепер поглянемо, що відбувається під час фази парсингу цієї програми:</p><ul><li>Двигун починає з першого рядка і він потрапляє на оголошення змінної <code>empData</code>.</li><li>Потім двигун провіряє, чи <code>empData</code> доступна в поточній області. Оскільки схожої змінної не знайдено, він шукає наявність цієї змінної в батьківських областях.</li><li>Двигун зупиняє свій пошук, оскільки немає доступних областей і поточна область є глобальною.</li><li>Далі двигун призначає значення <code>undefined</code> до змінної <code>empData</code> під час фази парсингу, щоб у випадку, коли щось у внутрішніх областях намагається посилатися на змінну, її можна було викликати.</li><li>Права частина оператора присвоєння «розв’язується» під час фази виконання програми.</li><li>Подібним чином двигун присвоює значення <code>undefined</code> до змінної <code>allPositions</code>.</li><li>Але на правій частині ми також посилаємось на змінну <code>empData</code>. На цьому етапі двигун провіряє, чи змінна доступна в поточній області. Оскільки вона доступна, на неї далі йде посилання (тобто вона доступна у глобальній області).</li><li>Двигун досі на правій частині оператора присвоєння, бо він помітив стрілкову функцію всередині функції «map». Оскільки двигун натрапив на визначення функції, він створює нову область. В ілюстрації ця область позначена цифрою 2. </li><li>Оскільки це нова область, ми даємо їй чорний колір.</li><li>Ця стрілкова функція має аргумент <code>data</code> та повертає <code>data.position</code>. У фазі парсингу, двигун підіймає всі потрібні змінні, посилавшись на змінні, доступні в поточній області, а також батьківській.</li><li>Всередині цієї функції згадується змінна <code>data</code>, тому двигун провіряє, чи поточна область має цю змінну. Оскільки змінна присутня в поточній області, посилання йде туди ж.</li><li>Коли двигун потрапляє на фігурну дужку <code>}</code>, він покидає функціональну область.</li><li>Вкінці програми знаходиться інструкція, яка друкує змінні <code>allPositions</code>. Оскільки згадується змінна <code>allPositions</code>, двигун шукає її в поточній області (тобто глобальній області). Оскільки вона знайдена, вона посилається туди ж в інструкції <code>console</code>.</li></ul><!--kg-card-begin: html--><h2 id="підсумки">Підсумки</h2><!--kg-card-end: html--><p>У цій статті ми ознайомилися з лексичною областю та розібралися, як вона працює, розглянувши простий приклад з забарвленням.</p><p>Дякую, що прочитали!</p><p>Підпишіться на мене у <a href="https://twitter.com/keurplkar">твіттері</a>, <a href="https://github.com/keyurparalkar">GitHub</a> та <a href="https://www.linkedin.com/in/keyur-paralkar-494415107/">LinkedIn</a>.</p><h2></h2><p></p><h2></h2><h3></h3><h2></h2><p></p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Чотири опори об’єктно-орієнтованого програмування ]]>
                </title>
                <description>
                    <![CDATA[ JavaScript є мовою, що підтримує багато парадигм програмування. Парадигмою програмування називають набір правил, згідно з якими ви пишете код, щоб було легше вирішити певну проблему. Якраз цим є чотири опори — принципами програмного забезпечення, які допомагають писати чистий об’єктно-орієнтований код. Цими принципами є:  * Абстракція  * Інкапсуляція  ]]>
                </description>
                <link>https://www.freecodecamp.org/ukrainian/news/chotyry-opory-obyektno-oriyentovanoho-prohramuvannya/</link>
                <guid isPermaLink="false">64b90bc6c565f0067c726995</guid>
                
                    <category>
                        <![CDATA[ об’єктно-орієнтоване програмування ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Ihor Lysak ]]>
                </dc:creator>
                <pubDate>Mon, 24 Jul 2023 11:24:25 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/ukrainian/news/content/images/2023/07/4-opory.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Оригінальна публікація:</strong> <a href="https://www.freecodecamp.org/news/four-pillars-of-object-oriented-programming/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">The Four Pillars of Object-Oriented Programming</a>
      </p><p>JavaScript є мовою, що підтримує багато парадигм програмування. Парадигмою програмування називають набір правил, згідно з якими ви пишете код, щоб було легше вирішити певну проблему.</p><p>Якраз цим є чотири опори — принципами програмного забезпечення, які допомагають писати чистий об’єктно-орієнтований код.</p><p>Цими принципами є:</p><ul><li>Абстракція</li><li>Інкапсуляція</li><li>Успадкування</li><li>Поліморфізм</li></ul><p>Давайте детальніше розглянемо кожен з них.</p><h1 id="-"><strong>Абстракція в об’єктно-орієнтованому програмуванні</strong></h1><p>Щось «абстрагувати» означає приховати деталі імплементації всередині певної обгортки — іноді прототипа, іноді функції. ­Як наслідок, при виклику функції вам не треба розуміти, як саме вона працює.</p><p>Якби ви мали досконало знати кожну функцію у великій базі коду, ви б взагалі не писали код. Вам довелося б потратити місяці на прочитання всього коду.</p><p>Ви можете створити придатну до багаторазового використання, гнучку та просту для розуміння базу коду, абстрагуючи певні деталі. Наприклад:</p><figure class="kg-card kg-code-card"><pre><code class="language-javascript">function hitAPI(type){
	if (type instanceof InitialLoad) {
		// приклад імплементації
	} else if (type instanceof NavBar) {
		// приклад імплементації
	} else {
		// приклад імплементації
	}
}</code></pre><figcaption>Цей код зовсім не використовує принцип абстракції.</figcaption></figure><p>Помітили, як у цьому прикладі довелося імплементувати все те, що потрібно для кожного сценарію використання?</p><p>Для кожного API, до якого вам потрібно звернутися, необхідно створювати новий блок <code>if</code> зі своєю власною імплементацією. Такий код не є абстрагованим, оскільки вам необхідно турбуватися про імплементацію кожного нового типу, який ви будете додавати. Такий код непридатний до повторного використання і його дуже складно підтримувати.</p><p>А що стосується прикладу знизу?</p><pre><code class="language-javascript">hitApi('www.kealanparr.com', HTTPMethod.Get)</code></pre><p>Ви можете просто передати URL та метод HTTP як аргументи до цієї функції і все.</p><p>Вам не потрібно думати про те, як ця функція працює. Ця проблема давно вирішена. Це суттєво допомагає повторному використанню коду і полегшує його утримання.</p><p>В цьому і полягає суть <strong>абстракції</strong>:<strong> </strong>в пошуку схожих частин коду та їх обгортанні в загальну функцію або об’єкт для використання в багатьох місцях/вирішення багатьох проблем.</p><p>Ось хороший підсумовуючий приклад <strong>абстракції</strong>: уявіть, що ви створюєте машину, яка робить каву для ваших користувачів. Ви можете використати два підходи:</p><h2 id="--1"><strong>Як створити кавову машину з абстракцією</strong></h2><ul><li>Створіть кнопку з заголовком «Зробити каву»</li></ul><h2 id="--2"><strong>Як створити кавову машину без абстракції</strong></h2><ul><li>Створіть кнопку з заголовком «Закип’ятити воду»</li><li>Створіть кнопку з заголовком «Налити холодну воду в чайник»</li><li>Створіть кнопку з заголовком «Насипати одну ложку кави в кружку»</li><li>Створіть кнопку з заголовком «Помити брудні кружки»</li><li>І багато інших кнопок</li></ul><p>Це дуже простий приклад, але суть в тому, що перший підхід <em>абстрагує</em> всю логіку в обгортку у вигляді кавової машини. А другий приклад змушує користувача вміти робити каву і зробити напій самостійно.</p><p>Наступна опора об’єктно-орієнтованого програмування покаже нам один зі способів, завдяки якому ми можемо досягнути <strong>абстракції</strong>, а саме за допомогою <strong>інкапсуляції</strong>.</p><h1 id="--3"><strong>Інкапсуляція в об’єктно-орієнтованому програмуванні</strong></h1><p>Визначенням інкапсуляції є «обмеження чогось у певних рамках, ніби у капсулі». По суті, <strong>інкапсуляція</strong> — це відбирання доступу до певних частин коду та їх приватизація (інкапсуляцію також часто називають приховуванням інформації). </p><p>Інкапсуляція означає, що кожен об’єкт у коді повинен контролювати свій стан. Стан — це поточний вигляд об’єкта, до якого відносять ключі, методи об’єкта, булеві властивості і так далі. Коли ви змінюєте булеве значення або видаляєте ключ з об’єкта, ви змінюєте його стан.</p><p>Обмежуйте доступ до частин свого коду. Робіть їх менш відкритими, якщо в них немає першочергової необхідності.</p><p>Приватні властивості в JavaScript можливі завдяки замиканням. Ось приклад нижче:</p><pre><code class="language-javascript">var Dog = (function () {

	// приватна
	var play = function () {
		// імплементація play
	};
    
	// приватна
	var breed = "Dalmatian"
    
	// публічна
	var name = "Rex";

	// публічна
	var makeNoise = function () {
 		return 'Bark bark!';
	};

 	return {
		makeNoise: makeNoise,
		name: name
 	};
})();

</code></pre><p>Спочатку ми створили функцію, яка одразу викликається (її називають <strong>виразом негайно викликаної функції</strong>, скорочено IIFE). Це створило об’єкт, до якого будь-хто має доступ, але разом з тим приховали деякі деталі. Ви не зможете викликати метод <code>play</code> та властивість <code>breed</code>, оскільки ми не зробили їх публічними в об’єкті, який повертає функція.</p><p>Використана нами схема називається <strong>паттерном викриття модуля</strong>, але це лише приклад того, як ви можете досягти <strong>інкапcуляції</strong>.</p><p>Я хотів би зосередитись саме на ідеї <strong>інкапсуляції </strong>(що набагато важливіше, ніж вивчити один паттерн і вважати, що ми повністю розібрали <strong>інкапсуляцію</strong>).</p><p>Зробіть перерву, щоб подумати над тим, як ви можете приховати свою інформацію та код і розділити їх. Модуляризація та чіткий розподіл обов’язків є ключовими для <strong>об’єктної орієнтації.</strong></p><p>Чому варто надавати перевагу приватності? Чому не можна просто зробити все глобальним?</p><ul><li>Багато непов’язаних між собою за змістом частин стануть залежними/згрупованими через глобальну змінну.</li><li>Скоріше за все, ви зміните значення змінних, якщо їхні імена будуть використовуватися декілька разів, що може привести до багів або непередбачуваної поведінки.</li><li>Ймовірно, ви створите багато <strong>спагеті</strong> (коду, який тяжко зрозуміти та в якому тяжко побачити, що зчитує та переписує змінні й змінює стан).</li></ul><p>Інкапсуляція може бути застосована шляхом поділу довгих рядків коду на менші окремі функції. Розподіліть ці функції на модулі. Ми приховуємо інформацію в місцях, де ніщо не має до неї доступ, відкриваючи лише те, що є необхідним.</p><p>По суті це і є <strong>інкапсуляцією</strong>: прив’язка вашої інформації до чогось, незалежно від того чи це клас, об’єкт, модуль або функція та спроба зробити її настільки приватною, наскільки це можливо в розумних рамках.</p><h1 id="--4"><strong>Успадкування в об’єктно-орієнтованому програмуванні</strong></h1><p>Успадкування дозволяє одному об’єкту отримувати властивості та методи від іншого. У JavaScript це реалізовано у вигляді <strong>прототипного успадкування</strong>.</p><p>Багаторазове використання є основною перевагою такого рішення. Іноді багато частин коду мають робити те саме, і в процесі вони мають виконувати однаково усе, окрім одної маленької деталі. Успадкування може вирішити таку проблему.</p><p>Коли б нами не використовувалось успадкування, ми намагаємося зробити все так, щоб батьківський об’єкт та об’єкт-нащадок мали <strong>високу згуртованість</strong>. Згуртованість — це змістовий зв’язок у коді. Наприклад, чи походить тип <code>Bird</code> від <code>DieselEngine</code>?</p><p>Намагайтеся робити успадкування у своєму коді легким для розуміння та передбачуваним. Не наслідуйте з абсолютно непов’язаних об’єктів лише через те, що вони мають один метод чи властивість, які вам потрібні. Успадкування не вирішує конкретно цю проблему.</p><p>При успадкуванні вам знадобиться більша частина наслідуваного функціоналу (вам не потрібно завжди наслідувати все).</p><p>Серед розробників відомий <strong>принцип підстановки Лісков</strong>. Цей принцип стверджує, що якщо ви можете використати батьківський клас (наприклад, <code>ParentType</code>) будь-де, де ви б використали спадкоємця (наприклад, <code>ChildType</code>) і <code>ChildType</code> успадковує від <code>ParentType</code> — тоді ви пройдете тест.</p><p>Головною причиною, з якої ви можете не пройти тест, є видалення об’єктом <code>ChildType</code> методів, які він успадкував від батьківського об’єкта. Це призвело б до <code>TypeError</code>, де методи чи властивості не визначені або є не тим, що ви очікували.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2020/12/image-146.png" class="kg-image" alt="image-146" width="600" height="400" loading="lazy"><figcaption>Виглядає так, ніби стрілки вказують у хибному напрямку. Але «Animal» є основою, тобто батьківським об’єктом.</figcaption></figure><p>Ланцюг успадкування — це термін, який використовується для описання потоку успадкування від прототипу об’єкта-основи (того, від якого успадковують всі інші об’єкти) до «кінця» ланцюга успадкування (останній об’єкт, що наслідує; в нашому випадку «Dog»).</p><p>Намагайтеся тримати свої ланцюги успадкування чистими та змістовними. Можна дуже легко почати писати антипаттерни під час <strong>успадкування </strong>(наприклад, <strong>антипаттерн крихкої основи</strong>). Таке стається, коли ваші прототипи-основи вважаються «крихкими», тому що ви робите «безпечну» зміну до об’єкта-основи, через яку ламаються всі спадкоємці.</p><h1 id="--5"><strong>Поліморфізм в об’єктно-орієнтованому програмуванні</strong></h1><p>Поліморфізм — це «можливість відбуватися в декількох різних формах». Саме за це і відповідає четверта опора об’єктно-орієнтованого програмування: за типи в межах окремих ланцюгів успадкування, які можуть робити різні речі.</p><p>Якщо ви правильно реалізували успадкування, ви можете використовувати батьківські об’єкти так само, як і їхніх нащадків. Коли два типи мають спільний ланцюг успадкування, їх можна використовувати почергово без помилок чи тверджень у своєму коді.</p><p>Згідно останнього малюнку, у нас може бути базовий прототип під назвою <code>Animal</code>, який визначає метод <code>makeNoise</code>. Кожен тип, що наслідує від цього прототипу, може переписати <code>makeNoise</code> таким чином, щоб він виконував власну функцію. Наприклад:</p><pre><code class="language-javascript">// Cтворимо приклади Dog та Animal
function Animal(){}
function Dog(){}

Animal.prototype.makeNoise = function(){
	console.log("Base noise");
};

// Більшість наших Animal мають 4. При потребі це можна змінити
Animal.prototype.legs = 4;

Dog.prototype = new Animal();

Dog.prototype.makeNoise = function(){
	console.log("Woof woof");  
};

var animal = new Animal();
var dog = new Dog();

animal.makeNoise(); // Base noise
dog.makeNoise();    // Woof woof — наслідок переписування
dog.legs;           // 4! — це було успадковано</code></pre><p><code>Dog</code> походить від <code>Animal</code> і може використовувати властивість <code>legs</code> за замовчуванням. Також він може мати власну імплементацію методу, визначеного в <code>Animal</code>, щоб мати власний звук.</p><p>Справжня сила поліморфізму полягає у спільності поведінки та можливості її зміни при потребі.</p><h1 id="--6"><strong>Висновки</strong></h1><p>Сподіваюсь, я зміг пояснити в чому полягають чотири опори об’єктно-орієнтованого програмування і те, як вони допомагають писати чистіший та практичніший код.</p><p>Якщо вам сподобалася ця стаття, можете підписатися на <a href="https://twitter.com/kealanparr">твіттер </a>автора, де він ділиться власними думками та новими статтями.</p> ]]>
                </content:encoded>
            </item>
        
    </channel>
</rss>
