HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-02-21
1 <p><a>#статьи</a></p>
1 <p><a>#статьи</a></p>
2 <ul><li>21 окт 2022</li>
2 <ul><li>21 окт 2022</li>
3 <li>0</li>
3 <li>0</li>
4 </ul><p>На практике разбираемся, чем различаются var, let и const и когда их использовать.</p>
4 </ul><p>На практике разбираемся, чем различаются var, let и const и когда их использовать.</p>
5 <p>Иллюстрация: Катя Павловская для Skillbox Media</p>
5 <p>Иллюстрация: Катя Павловская для Skillbox Media</p>
6 <p>Пишет о программировании, в свободное время создаёт игры. Мечтает открыть свою студию и выпускать ламповые RPG.</p>
6 <p>Пишет о программировании, в свободное время создаёт игры. Мечтает открыть свою студию и выпускать ламповые RPG.</p>
7 <p>Переменные в JavaScript можно создавать тремя способами - c помощью ключевых слов var, let и const. Они выполняют одну и ту же функцию (объявляют о создании именованной ячейки в памяти), но работают немного по-разному.</p>
7 <p>Переменные в JavaScript можно создавать тремя способами - c помощью ключевых слов var, let и const. Они выполняют одну и ту же функцию (объявляют о создании именованной ячейки в памяти), но работают немного по-разному.</p>
8 <p><strong>Содержание:</strong></p>
8 <p><strong>Содержание:</strong></p>
9 <ul><li><a>Что такое объявление, инициализация и область видимости</a></li>
9 <ul><li><a>Что такое объявление, инициализация и область видимости</a></li>
10 <li><a>Как работает var и что с ней не так</a></li>
10 <li><a>Как работает var и что с ней не так</a></li>
11 <li><a>Как работает let и чем она отличается от var</a></li>
11 <li><a>Как работает let и чем она отличается от var</a></li>
12 <li><a>Объявление констант с помощью оператора const</a></li>
12 <li><a>Объявление констант с помощью оператора const</a></li>
13 </ul><p>Перед тем как обсуждать отличия var, let и const, разберёмся с некоторыми базовыми понятиями.</p>
13 </ul><p>Перед тем как обсуждать отличия var, let и const, разберёмся с некоторыми базовыми понятиями.</p>
14 <p>Программы на JavaScript хранят числа, строки, логические значения и более сложные объекты в именованных ячейках памяти - переменных. Данные из этих ячеек можно применять в расчётах, выводить на экран и перезаписывать. К переменным обращаются по уникальному имени, или<strong>идентификатору</strong>.</p>
14 <p>Программы на JavaScript хранят числа, строки, логические значения и более сложные объекты в именованных ячейках памяти - переменных. Данные из этих ячеек можно применять в расчётах, выводить на экран и перезаписывать. К переменным обращаются по уникальному имени, или<strong>идентификатору</strong>.</p>
15 <p><strong>Объявить переменную</strong> - значит ввести новый идентификатор в программу.</p>
15 <p><strong>Объявить переменную</strong> - значит ввести новый идентификатор в программу.</p>
16 <p>До выхода стандарта ECMAScript 6 переменные в JavaScript объявляли только с помощью ключевого слова var:</p>
16 <p>До выхода стандарта ECMAScript 6 переменные в JavaScript объявляли только с помощью ключевого слова var:</p>
17 var best_podcast<p>Когда интерпретатор JavaScript находит очередное объявление с var, он выделяет место в памяти и по умолчанию присваивает элементу значение undefined - то есть "неопределённое". Также undefined можно получить, если обратиться к несуществующим элементам массива и свойствам объекта.</p>
17 var best_podcast<p>Когда интерпретатор JavaScript находит очередное объявление с var, он выделяет место в памяти и по умолчанию присваивает элементу значение undefined - то есть "неопределённое". Также undefined можно получить, если обратиться к несуществующим элементам массива и свойствам объекта.</p>
18 <p>Обращение к неопределённому значению может привести к непредсказуемым ошибкам, поэтому рекомендуется как можно раньше давать переменным начальное значение - то есть<strong>инициализировать</strong>их. Делается это с помощью оператора =:</p>
18 <p>Обращение к неопределённому значению может привести к непредсказуемым ошибкам, поэтому рекомендуется как можно раньше давать переменным начальное значение - то есть<strong>инициализировать</strong>их. Делается это с помощью оператора =:</p>
19 best_podcast = 'people and code';<p>Мы можем выводить переменную best_podcast на экран и перезаписывать её сколько угодно. Главное - чтобы в момент обращения программа её "видела". Да, в разные моменты времени переменные то скрываются, то появляются в поле зрения интерпретатора JavaScript.</p>
19 best_podcast = 'people and code';<p>Мы можем выводить переменную best_podcast на экран и перезаписывать её сколько угодно. Главное - чтобы в момент обращения программа её "видела". Да, в разные моменты времени переменные то скрываются, то появляются в поле зрения интерпретатора JavaScript.</p>
20 <p>Часть программы, в которой доступен тот или иной идентификатор, называют<strong>областью видимости переменной.</strong></p>
20 <p>Часть программы, в которой доступен тот или иной идентификатор, называют<strong>областью видимости переменной.</strong></p>
21 <p>В зависимости от области видимости в JavaScript различают<strong>локальные</strong>(functional scope) и <strong>глобальные</strong>(global scope) переменные. Локальные создаются внутри функции и доступны только в её пределах. А глобальные объявляются вне функций и видны в любой точке программы. Именно в работе с областью видимости и заключаются различия между var и let.</p>
21 <p>В зависимости от области видимости в JavaScript различают<strong>локальные</strong>(functional scope) и <strong>глобальные</strong>(global scope) переменные. Локальные создаются внутри функции и доступны только в её пределах. А глобальные объявляются вне функций и видны в любой точке программы. Именно в работе с областью видимости и заключаются различия между var и let.</p>
22 <p>Переменная var, созданная вне функции, действует как глобальная переменная - она доступна из любой части скрипта.</p>
22 <p>Переменная var, созданная вне функции, действует как глобальная переменная - она доступна из любой части скрипта.</p>
23 var a = 10; function func() { //Переменная создана глобально, поэтому её можно использовать где угодно a = 50; } func(); //Будет выведено 50 console.log(a);<p>Если же создать переменную с помощью var внутри функции, то она будет локальной, то есть доступной только в этой функции:</p>
23 var a = 10; function func() { //Переменная создана глобально, поэтому её можно использовать где угодно a = 50; } func(); //Будет выведено 50 console.log(a);<p>Если же создать переменную с помощью var внутри функции, то она будет локальной, то есть доступной только в этой функции:</p>
24 function func() { var a = 10; } func(); //Выведет ошибку, потому что переменная a доступна только внутри функции func() console.log(a);<p>Это позволяет создавать переменные с одинаковыми названиями и обращаться к внешним переменным через специальный объект window:</p>
24 function func() { var a = 10; } func(); //Выведет ошибку, потому что переменная a доступна только внутри функции func() console.log(a);<p>Это позволяет создавать переменные с одинаковыми названиями и обращаться к внешним переменным через специальный объект window:</p>
25 var x = 50; function func() { var x = 10; //Будет выведено 10 console.log(x); //Будет выведено 50 console.log(window.x); }<p>Не стоит привыкать к var. Использование этого ключевого слова в 2022 году считается плохой практикой по нескольким причинам.</p>
25 var x = 50; function func() { var x = 10; //Будет выведено 10 console.log(x); //Будет выведено 50 console.log(window.x); }<p>Не стоит привыкать к var. Использование этого ключевого слова в 2022 году считается плохой практикой по нескольким причинам.</p>
26 <p><strong>Отсутствие блочной области видимости.</strong>Var-переменная, созданная в блоке if‑else или цикле, доступна за пределами своего блока. Например, в C++ или Java не получится получить доступ к счётчику цикла нигде, кроме тела этого цикла, а вот в JavaScript, если счётчик объявлен как var, - получится легко. Это практически всегда приводит к труднораспознаваемым логическим ошибкам.</p>
26 <p><strong>Отсутствие блочной области видимости.</strong>Var-переменная, созданная в блоке if‑else или цикле, доступна за пределами своего блока. Например, в C++ или Java не получится получить доступ к счётчику цикла нигде, кроме тела этого цикла, а вот в JavaScript, если счётчик объявлен как var, - получится легко. Это практически всегда приводит к труднораспознаваемым логическим ошибкам.</p>
27 <p><strong>Повторное объявление.</strong>Переменные var можно создавать повторно, и компилятор не будет ругаться. Почему это плохо? Допустим, в вашем JS-файле 4000 строк кода. Вы объявили на 5-й строке переменную books, которая хранит количество PDF-книг на сайте. А затем, добравшись до 3005-й строки, забыли об этом и создали другую переменную books - только теперь она хранит количество книг в корзине покупателя. Даже если вы уверены, что всегда сможете отличить одну переменную от другой, то программисты, которые будут работать с вашим кодом, точно не скажут вам спасибо.</p>
27 <p><strong>Повторное объявление.</strong>Переменные var можно создавать повторно, и компилятор не будет ругаться. Почему это плохо? Допустим, в вашем JS-файле 4000 строк кода. Вы объявили на 5-й строке переменную books, которая хранит количество PDF-книг на сайте. А затем, добравшись до 3005-й строки, забыли об этом и создали другую переменную books - только теперь она хранит количество книг в корзине покупателя. Даже если вы уверены, что всегда сможете отличить одну переменную от другой, то программисты, которые будут работать с вашим кодом, точно не скажут вам спасибо.</p>
28 <p><strong>"Поднятие" переменной, или hoisting.</strong>Все переменные var считаются объявленными перед запуском скрипта. При этом они остаются undefined до тех пор, пока не выполнится код инициализации.</p>
28 <p><strong>"Поднятие" переменной, или hoisting.</strong>Все переменные var считаются объявленными перед запуском скрипта. При этом они остаются undefined до тех пор, пока не выполнится код инициализации.</p>
29 function showPodcast() { //Вызовем переменную перед её объявлением best_podcast = 'people and code'; if(false) { var best_podcast; } console.log(best_podcast); } showPodcast(); //Ошибки не будет, браузер выведет undefined<p>Если запустить приведённый выше код, компилятор выведет название лучшего подкаста про IT. Но почему? Ведь мы инициализировали переменную до того, как её определили. По "нормальной" логике интерпретатор должен вернуть сообщение об ошибке, потому что блок if никогда не выполнится и переменная не будет определена. Но с var такие парадоксы - обычное дело.</p>
29 function showPodcast() { //Вызовем переменную перед её объявлением best_podcast = 'people and code'; if(false) { var best_podcast; } console.log(best_podcast); } showPodcast(); //Ошибки не будет, браузер выведет undefined<p>Если запустить приведённый выше код, компилятор выведет название лучшего подкаста про IT. Но почему? Ведь мы инициализировали переменную до того, как её определили. По "нормальной" логике интерпретатор должен вернуть сообщение об ошибке, потому что блок if никогда не выполнится и переменная не будет определена. Но с var такие парадоксы - обычное дело.</p>
30 <p>В современном JS есть более однозначный и логичный способ определения переменных. Тем не менее вы не раз столкнётесь с var в легаси-коде, поэтому знать о нём полезно.</p>
30 <p>В современном JS есть более однозначный и логичный способ определения переменных. Тем не менее вы не раз столкнётесь с var в легаси-коде, поэтому знать о нём полезно.</p>
31 <p>Ключевое слово let лишено недостатков своего предшественника. Переменные, объявленные с его помощью, нельзя объявить повторно - программа выдаст ошибку. Let-переменные тоже "всплывают", но при попытке обратиться к ним до инициализации вы получите ошибку ReferenceError.</p>
31 <p>Ключевое слово let лишено недостатков своего предшественника. Переменные, объявленные с его помощью, нельзя объявить повторно - программа выдаст ошибку. Let-переменные тоже "всплывают", но при попытке обратиться к ним до инициализации вы получите ошибку ReferenceError.</p>
32 function showPodcast { //Вызовем переменную перед её объявлением console.log(best_podcast); let best_podcast = 'people and code'; } showPodcast(); //Получим ошибку. Спасибо, машина!<p>Но главное - такие переменные имеют блочную область видимости. А значит, они доступны только внутри того блока {}, в котором были созданы:</p>
32 function showPodcast { //Вызовем переменную перед её объявлением console.log(best_podcast); let best_podcast = 'people and code'; } showPodcast(); //Получим ошибку. Спасибо, машина!<p>Но главное - такие переменные имеют блочную область видимости. А значит, они доступны только внутри того блока {}, в котором были созданы:</p>
33 let a = 5; if(true) { let b = 5; } //Будет выведено, потому что переменная a объявлена вне какого-либо блока и доступна глобально console.log(a); //Вызовет ошибку, потому что переменная b объявлена внутри блока if и доступна только в нём console.log(b);<p>Вот как различается поведение счётчика цикла, если его создавать с помощью var и с помощью let:</p>
33 let a = 5; if(true) { let b = 5; } //Будет выведено, потому что переменная a объявлена вне какого-либо блока и доступна глобально console.log(a); //Вызовет ошибку, потому что переменная b объявлена внутри блока if и доступна только в нём console.log(b);<p>Вот как различается поведение счётчика цикла, если его создавать с помощью var и с помощью let:</p>
34 <strong>var</strong><strong>let</strong>for(var i = 0; i &lt; 5; i++) {}<p>//Переменная i доступна за пределами цикла</p>
34 <strong>var</strong><strong>let</strong>for(var i = 0; i &lt; 5; i++) {}<p>//Переменная i доступна за пределами цикла</p>
35 <p>console.log(i);</p>
35 <p>console.log(i);</p>
36 for(let i = 0; i &lt; 5; i++) {}<p>//Переменная i доступна только внутри цикла//Попытка использовать её приведёт к ошибке</p>
36 for(let i = 0; i &lt; 5; i++) {}<p>//Переменная i доступна только внутри цикла//Попытка использовать её приведёт к ошибке</p>
37 <p>console.log(i);</p>
37 <p>console.log(i);</p>
38 <p>В остальном поведение этих переменных идентично.</p>
38 <p>В остальном поведение этих переменных идентично.</p>
39 <p>С помощью ключевого слова const создаются константы. Например, физические и математические величины.</p>
39 <p>С помощью ключевого слова const создаются константы. Например, физические и математические величины.</p>
40 const Pi = 3.14; const c = 299792458; const g = 9.8;<p>Попытка изменить значение константы приведёт к ошибке. Поэтому их стоит использовать для хранения данных, которые должны оставаться неизменными.</p>
40 const Pi = 3.14; const c = 299792458; const g = 9.8;<p>Попытка изменить значение константы приведёт к ошибке. Поэтому их стоит использовать для хранения данных, которые должны оставаться неизменными.</p>
41 <p>Например, в них можно хранить объекты из DOM:</p>
41 <p>Например, в них можно хранить объекты из DOM:</p>
42 const content = document.getElementById("content");<p>Также стоит отметить, что неизменяемым сохраняется сам объект, а не его поля:</p>
42 const content = document.getElementById("content");<p>Также стоит отметить, что неизменяемым сохраняется сам объект, а не его поля:</p>
43 const obj = { x: 1, y: 5, z: 12 }; //Возможно obj.x = 5; //Выдаст ошибку obj = 1; //Попытка задать другой объект тоже приведёт к ошибке obj = { x: 51, y: 12, z: 8 };<p>Что касается областей видимости, то const ведёт себя как let - разницы между ними нет.</p>
43 const obj = { x: 1, y: 5, z: 12 }; //Возможно obj.x = 5; //Выдаст ошибку obj = 1; //Попытка задать другой объект тоже приведёт к ошибке obj = { x: 51, y: 12, z: 8 };<p>Что касается областей видимости, то const ведёт себя как let - разницы между ними нет.</p>
44 <p><strong>Обратите внимание:</strong>let и const являются частью стандарта ECMAScript 6, который поддерживается не всеми браузерами. Заранее ознакомьтесь с <a>таблицей совместимости</a>.</p>
44 <p><strong>Обратите внимание:</strong>let и const являются частью стандарта ECMAScript 6, который поддерживается не всеми браузерами. Заранее ознакомьтесь с <a>таблицей совместимости</a>.</p>
45 <p>В большинстве случаев достаточно использовать var, но иногда необходимо убедиться, что ваши данные в сохранности - их нельзя изменить извне или изменить в принципе. В этих случаях let и const незаменимы.</p>
45 <p>В большинстве случаев достаточно использовать var, но иногда необходимо убедиться, что ваши данные в сохранности - их нельзя изменить извне или изменить в принципе. В этих случаях let и const незаменимы.</p>
46 <a>Курс с трудоустройством: "Профессия Фронтенд-разработчик + ИИ" Узнать о курсе</a>
46 <a>Курс с трудоустройством: "Профессия Фронтенд-разработчик + ИИ" Узнать о курсе</a>