ÐнÑоÑмаÑÑÑ Ð² ÑÑй ÑÑаÑÑÑ ÐºÐ¾ÑиÑна Ð´Ð»Ñ ÑозÑмÑÐ½Ð½Ñ ÑÑаÑÐ¸Ñ ÑкÑипÑÑв.
ÐаÑаз Ñак код не пиÑÑÑÑ.
У пеÑÑÐ¾Ð¼Ñ ÑоздÑÐ»Ñ Ð¿Ñо змÑннÑ, ми ознайомилиÑÑ Ð· ÑÑÑома ÑпоÑобами оголоÑÐµÐ½Ð½Ñ Ð·Ð¼ÑÐ½Ð½Ð¸Ñ :
letconstvar
ÐголоÑÐµÐ½Ð½Ñ Ð·Ð° Ð´Ð¾Ð¿Ð¾Ð¼Ð¾Ð³Ð¾Ñ var подÑбне до let. У бÑлÑÑоÑÑÑ Ð²Ð¸Ð¿Ð°Ð´ÐºÑв ми можемо замÑниÑи let на var або навпаки Ñ Ð¾ÑÑкÑваÑи, Ñо Ñе бÑде пÑаÑÑваÑи:
var message = "ÐÑивÑÑ";
alert(message); // ÐÑивÑÑ
Ðле var â Ñе зовÑÑм ÑнÑий звÑÑ, Ñкий поÑ
одиÑÑ Ð· дÑже давнÑÑ
ÑаÑÑв. ÐазвиÑай вÑн не викоÑиÑÑовÑÑÑÑÑÑ Ð² ÑÑÑаÑниÑ
ÑкÑипÑаÑ
, але вÑе Ñе може пеÑеÑ
овÑваÑиÑÑ Ñ ÑÑаÑиÑ
.
ЯкÑо ви не планÑÑÑе пÑаÑÑваÑи з Ñакими ÑкÑипÑами, ви можеÑе навÑÑÑ Ð¿ÑопÑÑÑиÑи Ñей ÑоздÑл або вÑдклаÑÑи його.
Ð ÑнÑого бокÑ, важливо ÑозÑмÑÑи вÑдмÑнноÑÑÑ Ð¿Ñи мÑгÑаÑÑÑ ÑÑаÑиÑ
ÑкÑипÑÑв з var на let, Ñоб ÑникаÑи зайвиÑ
помилок.
ÐÐ»Ñ âvarâ не ÑÑнÑÑ Ð±Ð»Ð¾ÑÐ½Ð¾Ñ Ð¾Ð±Ð»Ð°ÑÑÑ Ð²Ð¸Ð´Ð¸Ð¼Ð¾ÑÑÑ
ÐмÑннÑ, оголоÑÐµÐ½Ñ Ð·Ð° Ð´Ð¾Ð¿Ð¾Ð¼Ð¾Ð³Ð¾Ñ var, маÑÑÑ Ð°Ð±Ð¾ ÑÑнкÑÑоналÑнÑ, або глобалÑÐ½Ñ Ð¾Ð±Ð»Ð°ÑÑÑ Ð²Ð¸Ð´Ð¸Ð¼Ð¾ÑÑÑ. Ðони Ð²Ð¸Ð´Ð¸Ð¼Ñ Ð·Ð° межами блокÑ.
ÐапÑиклад:
if (true) {
var test = true; // викоÑиÑÑовÑÑмо "var" замÑÑÑÑ "let"
}
alert(test); // true, змÑнна ÑÑнÑÑ Ð¿Ð¾Ð·Ð° блоком if
Так Ñк var ÑгноÑÑÑ Ð±Ð»Ð¾ÐºÐ¸, ми оÑÑимали глобалÑÐ½Ñ Ð·Ð¼ÑÐ½Ð½Ñ test.
ЯкÑо б ми викоÑиÑÑали let test замÑÑÑÑ var test, ÑÐ¾Ð´Ñ Ð·Ð¼Ñнна бÑла б видима ÑÑлÑки вÑеÑÐµÐ´Ð¸Ð½Ñ if:
if (true) {
let test = true; // викоÑиÑÑовÑÑмо "let"
}
alert(test); // ReferenceError: test не оголоÑена
Те Ñаме Ñ Ð´Ð»Ñ ÑиклÑв: змÑнна, оголоÑена за Ð´Ð¾Ð¿Ð¾Ð¼Ð¾Ð³Ð¾Ñ var, не може бÑÑи блоÑÐ½Ð¾Ñ Ð°Ð±Ð¾ локалÑÐ½Ð¾Ñ Ð²ÑеÑÐµÐ´Ð¸Ð½Ñ Ñикла:
for (var i = 0; i < 10; i++) {
var one = 1;
// ...
}
alert(i); // 10, "i" видима за межами ÑиклÑ, Ñе глобалÑна змÑнна
alert(one); // 1, "one" видима за межами ÑиклÑ, Ñе глобалÑна змÑнна
ЯкÑо блок ÐºÐ¾Ð´Ñ Ð·Ð½Ð°Ñ
одиÑÑÑÑ Ð²ÑеÑÐµÐ´Ð¸Ð½Ñ ÑÑнкÑÑÑ, ÑÐ¾Ð´Ñ var ÑÑÐ°Ñ Ð·Ð¼ÑÐ½Ð½Ð¾Ñ ÑÑÐ²Ð½Ñ ÑÑнкÑÑÑ:
function sayHi() {
if (true) {
var phrase = "ÐÑивÑÑ";
}
alert(phrase); // ÑпÑаÑÑовÑÑ
}
sayHi();
alert(phrase); // ReferenceError: phrase не оголоÑена
Як ми баÑимо, var виÑ
одиÑÑ Ð·Ð° Ð¼ÐµÐ¶Ñ if, for або ÑнÑиÑ
блокÑв кодÑ. Так вÑдбÑваÑÑÑÑÑ ÑомÑ, Ñо колиÑÑ Ð±Ð»Ð¾ÐºÐ¸ Ñ JavaScript не мали лекÑиÑного ÑеÑедовиÑа, ÑÐ¾Ð¼Ñ var â Ñе пеÑежиÑок минÑлого.
âvarâ ÑеÑпиÑÑ Ð¿Ð¾Ð²ÑоÑÐ½Ñ Ð¾Ð³Ð¾Ð»Ð¾ÑеннÑ
ЯкÑо ми оголоÑимо Ð¾Ð´Ð½Ñ Ñ ÑÑ Ð¶ змÑÐ½Ð½Ñ Ð·Ð° Ð´Ð¾Ð¿Ð¾Ð¼Ð¾Ð³Ð¾Ñ let двÑÑÑ Ð² однÑй облаÑÑÑ Ð²Ð¸Ð´Ð¸Ð¼Ð¾ÑÑÑ, маÑимемо помилкÑ:
let user;
let user; // SyntaxError: 'user' вже оголоÑена
Ð var, ми можемо повÑоÑно оголоÑÑваÑи змÑÐ½Ð½Ñ Ð±ÐµÐ·Ð»ÑÑ ÑазÑв. ЯкÑо ми викоÑиÑÑовÑÑмо var Ñз вже оголоÑÐµÐ½Ð½Ð¾Ñ Ð·Ð¼ÑнноÑ, воно пÑоÑÑо ÑгноÑÑÑÑÑÑÑ:
var user = "ÐеÑÑо";
var user = "Ðван"; // Ñей "var" нÑÑого не ÑобиÑÑ (змÑнна вже оголоÑена). ÐмÑниÑÑÑÑ Ð»Ð¸Ñе знаÑеннÑ
// ...помилки не виникне
alert(user); // Ðван
ÐмÑÐ½Ð½Ñ âvarâ можÑÑÑ Ð±ÑÑи оголоÑÐµÐ½Ñ Ð¿ÑÑÐ»Ñ ÑÑ Ð²Ð¸ÐºÐ¾ÑиÑÑаннÑ
ÐголоÑÐµÐ½Ð½Ñ Ð·Ð° Ð´Ð¾Ð¿Ð¾Ð¼Ð¾Ð³Ð¾Ñ var обÑоблÑÑÑÑÑÑ Ð¿Ñи запÑÑÐºÑ ÑÑнкÑÑÑ (або ÑкÑипÑа Ð´Ð»Ñ Ð³Ð»Ð¾Ð±Ð°Ð»ÑниÑ
змÑнниÑ
).
ÐнÑими Ñловами, змÑÐ½Ð½Ñ var оголоÑÑÑÑÑÑÑ Ð½Ð° поÑаÑÐºÑ ÑÑнкÑÑÑ, незалежного вÑд Ñого, де Ñаме знаÑ
одиÑÑÑÑ Ð¾Ð³Ð¾Ð»Ð¾ÑÐµÐ½Ð½Ñ (за Ñмови, Ñо оголоÑÐµÐ½Ð½Ñ Ð½Ðµ пеÑебÑÐ²Ð°Ñ Ñ Ð²ÐºÐ»Ð°Ð´ÐµÐ½Ñй ÑÑнкÑÑÑ).
ÐÑже, Ñей код:
function sayHi() {
phrase = "ÐÑивÑÑ";
alert(phrase);
var phrase;
}
sayHi();
â¦ÑеÑ
нÑÑно Ñакий Ñамий, Ñк Ñ Ñей (var phrase пеÑемÑÑена виÑе):
function sayHi() {
var phrase;
phrase = "ÐÑивÑÑ";
alert(phrase);
}
sayHi();
â¦Ðбо навÑÑÑ Ñк Ñей (памâÑÑайÑе, блоки ÐºÐ¾Ð´Ñ ÑгноÑÑÑÑÑÑÑ):
function sayHi() {
phrase = "ÐÑивÑÑ"; // (*)
if (false) {
var phrase;
}
alert(phrase);
}
sayHi();
Ð¢Ð°ÐºÑ Ð¿Ð¾Ð²ÐµÐ´ÑÐ½ÐºÑ Ð½Ð°Ð·Ð¸Ð²Ð°ÑÑÑ âпÑднÑÑÑÑмâ (hoisting), оÑкÑлÑки вÑÑ var âпÑднÑмаÑÑÑÑÑâ на поÑаÑок ÑÑнкÑÑÑ.
ÐÑже, Ñ Ð¿ÑикладÑ, Ð½Ð°Ð²ÐµÐ´ÐµÐ½Ð¾Ð¼Ñ Ð²Ð¸Ñе, if (false) нÑколи не виконÑÑÑÑÑÑ, але Ñе не Ð¼Ð°Ñ Ð·Ð½Ð°ÑеннÑ. var вÑеÑÐµÐ´Ð¸Ð½Ñ Ð½Ñого обÑоблÑÑÑÑÑÑ Ð½Ð° поÑаÑÐºÑ ÑÑнкÑÑÑ, ÑÐ¾Ð¼Ñ Ñ Ð¼Ð¾Ð¼ÐµÐ½Ñ, познаÑений (*) змÑнна ÑÑнÑÑ.
ÐголоÑÐµÐ½Ð½Ñ Ð·Ð¼ÑÐ½Ð½Ð¸Ñ Ð¿ÑднÑмаÑÑÑÑÑ, але пÑиÑвоÑÐ½Ð½Ñ Ð·Ð½Ð°ÑÐµÐ½Ñ â нÑ.
ÐÑаÑе пÑодемонÑÑÑÑваÑи Ñе на пÑикладÑ:
function sayHi() {
alert(phrase);
var phrase = "ÐÑивÑÑ";
}
sayHi();
Ð Ñдок var phrase = "ÐÑивÑÑ" ÑкладаÑÑÑÑÑ Ð· двоÑ
дÑй:
- ÐголоÑÐµÐ½Ð½Ñ Ð·Ð¼ÑнноÑ
var - ÐÑиÑвоÑÐ½Ð½Ñ Ð·Ð½Ð°ÑÐµÐ½Ð½Ñ Ð·Ð¼ÑннÑй
=.
ÐголоÑÐµÐ½Ð½Ñ Ð¾Ð±ÑоблÑÑÑÑÑÑ Ð½Ð° поÑаÑÐºÑ Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ ÑÑнкÑÑÑ (âпÑднÑмаÑÑÑÑÑâ), однак пÑиÑвоÑÐ½Ð½Ñ Ð·Ð½Ð°ÑÐµÐ½Ñ Ð·Ð°Ð²Ð¶Ð´Ð¸ вÑдбÑваÑÑÑÑÑ Ð² ÑÐ¾Ð¼Ñ ÑÑÐ´ÐºÑ ÐºÐ¾Ð´Ñ, де воно вказано. ÐÑже, код пÑаÑÑÑ Ð½Ð°ÑÑÑпним Ñином:
function sayHi() {
var phrase; // оголоÑÐµÐ½Ð½Ñ Ð·Ð¼ÑÐ½Ð½Ð¾Ñ ÑпÑаÑÑовÑÑ ÑпоÑаÑкÑ...
alert(phrase); // undefined
phrase = "ÐÑивÑÑ"; // ...пÑиÑвоÑÐ½Ð½Ñ - в моменÑ, коли виконÑÑÑÑÑÑ Ð´Ð°Ð½Ð¸Ð¹ ÑÑдок кодÑ.
}
sayHi();
ÐÑкÑлÑки вÑÑ Ð¾Ð³Ð¾Ð»Ð¾ÑÐµÐ½Ð½Ñ var обÑоблÑÑÑÑÑÑ Ð¿Ñи запÑÑÐºÑ ÑÑнкÑÑÑ, ми можемо поÑилаÑиÑÑ Ð½Ð° ниÑ
Ñ Ð±ÑдÑ-ÑÐºÐ¾Ð¼Ñ Ð¼ÑÑÑÑ. Ðле до оголоÑÐµÐ½Ð½Ñ Ð²ÑÑ Ð·Ð¼ÑÐ½Ð½Ñ Ð¼Ð°ÑÑÑ Ð·Ð½Ð°ÑÐµÐ½Ð½Ñ undefined.
РобоÑ
пÑикладаÑ
, наведениÑ
виÑе, alert ÑпÑаÑÑовÑÑ Ð±ÐµÐ· помилок, бо змÑнна phrase ÑÑнÑÑ. Ðле знаÑÐµÐ½Ð½Ñ Ñй Ñе не бÑло пÑиÑвоÑне, ÑÐ¾Ð¼Ñ Ð²Ð¾Ð½Ð¾ показÑÑ undefined.
IIFE
РанÑÑе, оÑкÑлÑки ÑÑнÑвав ÑÑлÑки var, видимÑÑÑÑ Ð·Ð¼ÑнниÑ
не обмежÑвалаÑÑ ÑÑвнем блокÑв, але пÑогÑамÑÑÑи знайÑли ÑпоÑÑб Ñе емÑлÑваÑи. Те, Ñо вони зÑобили, мало Ð½Ð°Ð·Ð²Ñ âÑÑнкÑÑоналÑÐ½Ñ Ð²Ð¸Ñази, Ñо викликаÑÑÑÑÑ Ð½ÐµÐ³Ð°Ð¹Ð½Ð¾â (immediately-invoked function expressions â IIFE).
СÑÐ¾Ð³Ð¾Ð´Ð½Ñ Ñе не ÑлÑд викоÑиÑÑовÑваÑи, але Ñе можна знайÑи Ñ ÑÑаÑÐ¸Ñ ÑкÑипÑÐ°Ñ .
IIFE виглÑÐ´Ð°Ñ Ñак:
(function() {
var message = "ÐÑивÑÑ";
alert(message); // ÐÑивÑÑ
})();
ТÑÑ ÑÑвоÑÑÑÑÑÑÑ Ñ Ð½ÐµÐ³Ð°Ð¹Ð½Ð¾ викликаÑÑÑÑÑ Function Expression (ФÑнкÑÑоналÑний виÑаз). Таким Ñином, код виконÑÑÑÑÑÑ Ð²ÑдÑÐ°Ð·Ñ Ñ Ð¼Ð°Ñ Ð²Ð»Ð°ÑÐ½Ñ Ð¿ÑиваÑÐ½Ñ Ð·Ð¼ÑннÑ.
Function Expression обгоÑÑаÑÑÑÑÑ Ð´Ñжками(function {...}), ÑÐ¾Ð¼Ñ Ñо коли ÑÑÑÑй JavaScript зÑÑÑÑÑÑÐ°Ñ "function" в оÑÐ½Ð¾Ð²Ð½Ð¾Ð¼Ñ ÐºÐ¾Ð´Ñ, вÑн ÑозÑмÑÑ Ñе Ñк поÑаÑок Function Declaration. Ðле Function Declaration повинна маÑи назвÑ, ÑÐ¾Ð¼Ñ Ñакий код виклиÑе помилкÑ:
// ÐамагаÑÑÑÑÑ Ð¾Ð³Ð¾Ð»Ð¾ÑиÑи Ñ Ð½ÐµÐ³Ð°Ð¹Ð½Ð¾ викликаÑи ÑÑнкÑÑÑ
function() { // <-- SyntaxError: ÐпеÑаÑоÑи ÑÑнкÑÑй вимагаÑÑÑ Ð½Ð°Ð·Ð²Ð¸
var message = "ÐÑивÑÑ";
alert(message); // ÐÑивÑÑ
}();
ÐавÑÑÑ ÑкÑо ми Ñкажемо: âдобÑе, додамо назвÑâ, Ñе не ÑпÑаÑÑÑ, оÑкÑлÑки JavaScript не дозволÑÑ Ð½ÐµÐ³Ð°Ð¹Ð½Ð¾ викликаÑи Function Declarations:
// ÑинÑакÑиÑна помилка ÑеÑез дÑжки нижÑе
function go() {
}(); // <-- не може негайно викликаÑи Function Declaration
ÐÑже, дÑжки навколо ÑÑнкÑÑÑ â Ñе Ñ Ð¸ÑÑÑÑÑÑ, Ñоб показаÑи JavaScript, Ñо ÑÑнкÑÑÑ ÑÑвоÑена в конÑекÑÑÑ ÑнÑого виÑазÑ, а оÑже, Ñе Function Expression: вона не поÑÑебÑÑ Ð½Ð°Ð·Ð²Ð¸ Ñ ÑÑ Ð¼Ð¾Ð¶Ð½Ð° викликаÑи негайно.
ÐÑÑм дÑжок, ÑÑнÑÑÑÑ ÑнÑÑ ÑпоÑоби повÑдомиÑи JavaScript, Ñо ми маÑмо на ÑÐ²Ð°Ð·Ñ Function Expression:
// СпоÑоби ÑÑвоÑÐµÐ½Ð½Ñ IIFE
(function() {
alert("ÐÑжки навколо ÑÑнкÑÑÑ");
})();
(function() {
alert("ÐÑÑÐ³Ð»Ñ Ð´Ñжки навколо вÑÑого");
}());
!function() {
alert("ÐобÑÑовий опеÑаÑÐ¾Ñ NOT запÑÑÐºÐ°Ñ Ð²Ð¸Ñаз");
}();
+function() {
alert("УнаÑний плÑÑ Ð·Ð°Ð¿ÑÑÐºÐ°Ñ Ð²Ð¸Ñаз");
}();
У вÑÑÑ Ð²Ð¸ÑÐµÐ½Ð°Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð²Ð¸Ð¿Ð°Ð´ÐºÐ°Ñ Ð¼Ð¸ оголоÑÑÑмо Function Expression Ñ Ð½ÐµÐ³Ð°Ð¹Ð½Ð¾ запÑÑкаÑмо його. ÐаÑважимо Ñе Ñаз: Ð½Ð¸Ð½Ñ Ð½ÐµÐ¼Ð°Ñ Ð¿ÑиÑин пиÑаÑи Ñакий код.
ÐÑдÑÑмки
ÐÑнÑÑ Ð´Ð²Ñ Ð¾ÑÐ½Ð¾Ð²Ð½Ñ Ð²ÑдмÑнноÑÑÑ Ð¼Ñж var Ñа let/const:
- ÐмÑннÑ
varне маÑÑÑ Ð±Ð»Ð¾ÑÐ½Ð¾Ñ Ð¾Ð±Ð»Ð°ÑÑÑ Ð²Ð¸Ð´Ð¸Ð¼Ð¾ÑÑÑ, ÑÑ Ð²Ð¸Ð´Ð¸Ð¼ÑÑÑÑ Ð²Ð¸Ð·Ð½Ð°ÑаÑÑÑÑÑ Ð¿Ð¾ÑоÑÐ½Ð¾Ñ ÑÑнкÑÑÑÑ Ð°Ð±Ð¾ глобалÑно, ÑкÑо оголоÑÐµÐ½Ñ Ð¿Ð¾Ð·Ð° ÑÑнкÑÑÑÑ. - ÐголоÑÐµÐ½Ð½Ñ Ð·Ð° допомогоÑ
varобÑоблÑÑÑÑÑÑ Ð¿Ñи запÑÑÐºÑ ÑÑнкÑÑÑ (або ÑкÑипÑа Ð´Ð»Ñ Ð³Ð»Ð¾Ð±Ð°Ð»ÑÐ½Ð¸Ñ Ð·Ð¼ÑÐ½Ð½Ð¸Ñ ).
ÐÑнÑÑ Ñе одна дÑже незнаÑна вÑдмÑннÑÑÑÑ, повâÑзана з глобалÑним обâÑкÑом, ÑÐºÑ Ð¼Ð¸ ÑозглÑнемо в наÑÑÑÐ¿Ð½Ð¾Ð¼Ñ ÑоздÑлÑ.
Ð¦Ñ Ð²ÑдмÑнноÑÑÑ ÑоблÑÑÑ var гÑÑÑе, нÑж let Ñ Ð±ÑлÑÑоÑÑÑ Ð²Ð¸Ð¿Ð°Ð´ÐºÑв. ÐлоÑна облаÑÑÑ Ð²Ð¸Ð´Ð¸Ð¼Ð¾ÑÑÑ â гаÑна ÑÑÑ. ÐÑÑ ÑÐ¾Ð¼Ñ let давно бÑв введений до ÑÑандаÑÑÑ Ñ ÑÐµÐ¿ÐµÑ Ñ Ð¾Ñновним ÑпоÑобом (Ñазом з const) оголоÑÑÐ²Ð°Ð½Ð½Ñ Ð·Ð¼ÑнниÑ
.
ÐоменÑаÑÑ
<code>, Ð´Ð»Ñ ÐºÑлÑÐºÐ¾Ñ ÑÑдкÑв â обгоÑнÑÑÑ ÑÑ Ñегом<pre>, Ð´Ð»Ñ Ð¿Ð¾Ð½Ð°Ð´ 10 ÑÑдкÑв â викоÑиÑÑовÑйÑе пÑÑоÑниÑÑ (plnkr, jsbin, codepenâ¦)