diff options
Diffstat (limited to 'files/ru/glossary/hoisting/index.html')
-rw-r--r-- | files/ru/glossary/hoisting/index.html | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/files/ru/glossary/hoisting/index.html b/files/ru/glossary/hoisting/index.html new file mode 100644 index 0000000000..a0f3683ec5 --- /dev/null +++ b/files/ru/glossary/hoisting/index.html @@ -0,0 +1,75 @@ +--- +title: Поднятие +slug: Glossary/Hoisting +translation_of: Glossary/Hoisting +original_slug: Словарь/Поднятие +--- +<p>Поднятие (hoisting) — термин, который вы <em>не</em> встретите в документации JavaScript. Поднятие задумывалось как общий способ мышления о том, как контекст исполнения (в частности, фазы создания и исполнения) работает в JavaScript. Однако, hoisting может привести и к недоразумениям. Например, hoisting учит, что объявление переменной или функции физически перемещается в начало вашего кода, хотя в действительности этого не происходит. На самом же деле, объявления переменных и функций попадают в память в процессе фазы компиляции, но остаются в коде на том месте, где вы их объявили.</p> + +<h2 id="Узнаем_больше">Узнаем больше</h2> + +<h3 id="Пример">Пример:</h3> + +<p>Одним из преимуществ помещения в память объявлений функций до выполнения кода то, что можно использовать функцию до ее объявления. Например:</p> + +<pre class="brush: js">function catName(name) { + console.log("Мою кошку зовут " + name); +} + +catName("Тигр"); +/* +Результатом будет вывод строки: "Мою кошку зовут Тигр" +*/ +</pre> + +<p>Предыдущий пример демонстрирует ожидаемый рабочий код. Теперь давайте посмотрим, что происходит, когда мы вызываем функцию в коде до ее объявления:</p> + +<pre class="brush: js">catName("Раиса"); + +function catName(name) { + console.log("Мою кошку зовут " + name); +} +/* +Результатом будет вывод строки: "Мою кошку зовут Раиса" +*/ +</pre> + +<p>Даже если мы вызываем функцию до ее объявления, код работает. Это происходит благодаря тому, как работает контекст выполнения в JavaScript.</p> + +<p> </p> + +<p><code>Hoisting</code> хорошо работает и с другими типами данных и переменными. Переменные могут быть инициализированы и использованы до их объявления. Однако, они не могут быть использованы без инициализации.</p> + +<h3 id="Пример_2">Пример:<br> + </h3> + +<pre>num = 6; +num + 7; +var num; +/* не генерирует ошибку, так как num объявлен */ + +</pre> + +<p>JavaScript "поднимает" только объявление, но не инициализацию. Если вы используете переменную, объявленную и проинициализированную после ее использования, то значение будет <code>undefined</code>. Два примера ниже демонстрируют это поведение.<br> + </p> + +<pre>var x = 1; // Инициализируем x +console.log(x + " " + y); // '1 undefined' +var y = 2; +//код выше и код ниже одинаковые + +var x = 1; // Инициализируем x +var y; // Объявляем y +console.log(x + " " + y); // '1 undefined' +y = 2; // Инициализируем y +</pre> + +<p> </p> + +<h3 id="Technical_reference">Technical reference</h3> + +<ul> + <li><a href="https://www.udemy.com/understand-javascript/">JavaScript: Understanding the Weird Parts</a> - Udemy.com Course</li> + <li><a href="/ru/docs/Web/JavaScript/Reference/Statements/var">var - объявление переменной</a> - MDN</li> + <li><a href="/ru/docs/Web/JavaScript/Reference/Statements/function">Функция</a> - MDN</li> +</ul> |