ÐнÑоÑмаÑиÑ, пÑÐ¸Ð²ÐµÐ´ÐµÐ½Ð½Ð°Ñ Ð² ÑÑой ÑÑаÑÑе, полезна Ð´Ð»Ñ Ð¿Ð¾Ð½Ð¸Ð¼Ð°Ð½Ð¸Ñ ÑÑаÑÑÑ ÑкÑипÑов.
ÐÑ Ð½Ðµ пиÑем ÑовÑеменнÑй код Ñаким обÑазом.
Ð Ñамой пеÑвой главе пÑо пеÑеменнÑе Ð¼Ñ Ð¾Ð·Ð½Ð°ÐºÐ¾Ð¼Ð¸Ð»Ð¸ÑÑ Ñ ÑÑÐµÐ¼Ñ ÑпоÑобами обÑÑÐ²Ð»ÐµÐ½Ð¸Ñ Ð¿ÐµÑеменнÑÑ :
letconstvar
let и const ведÑÑ ÑÐµÐ±Ñ Ð¾Ð´Ð¸Ð½Ð°ÐºÐ¾Ð²Ð¾ по оÑноÑÐµÐ½Ð¸Ñ Ðº лекÑиÑеÑÐºÐ¾Ð¼Ñ Ð¾ÐºÑÑжениÑ, облаÑÑи видимоÑÑи.
Ðо var â ÑÑо ÑовеÑÑенно дÑÑгой звеÑÑ, беÑÑÑий ÑÐ²Ð¾Ñ Ð½Ð°Ñало Ñ Ð´Ð°Ð²Ð½Ð¸Ñ
вÑемÑн. ÐбÑÑно var не иÑполÑзÑеÑÑÑ Ð² ÑовÑеменнÑÑ
ÑкÑипÑаÑ
, но вÑÑ ÐµÑÑ Ð¼Ð¾Ð¶ÐµÑ ÑкÑÑваÑÑÑÑ Ð² ÑÑаÑÑÑ
.
ÐÑли в даннÑй Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð²Ñ Ð½Ðµ ÑабоÑаеÑе Ñ Ð¿Ð¾Ð´Ð¾Ð±Ð½Ñми ÑкÑипÑами, Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе пÑопÑÑÑиÑÑ Ð¸Ð»Ð¸ оÑложиÑÑ Ð¿ÑоÑÑение данной главÑ, однако, еÑÑÑ ÑанÑ, ÑÑо Ð²Ñ ÑÑолкнÑÑеÑÑ Ñ var в бÑдÑÑем.
Ðа пеÑвÑй взглÑд, поведение var поÑ
оже на let. ÐапÑимеÑ, обÑÑвление пеÑеменной:
function sayHi() {
var phrase = "ÐÑивеÑ"; // локалÑÐ½Ð°Ñ Ð¿ÐµÑеменнаÑ, "var" вмеÑÑо "let"
alert(phrase); // ÐÑивеÑ
}
sayHi();
alert(phrase); // ÐÑибка: phrase не опÑеделена
â¦Ðднако, оÑлиÑÐ¸Ñ Ð²ÑÑ Ð¶Ðµ еÑÑÑ.
ÐÐ»Ñ Â«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); // Error: test is not defined
ÐналогиÑно Ð´Ð»Ñ Ñиклов: var не Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð±Ð»Ð¾Ñной или локалÑной внÑÑÑи Ñикла:
for (var i = 0; i < 10; i++) {
// ...
}
alert(i); // 10, пеÑÐµÐ¼ÐµÐ½Ð½Ð°Ñ i доÑÑÑпна вне Ñикла, Ñ.к. ÑвлÑеÑÑÑ Ð³Ð»Ð¾Ð±Ð°Ð»Ñной пеÑеменной
ÐÑли блок кода наÑ
одиÑÑÑ Ð²Ð½ÑÑÑи ÑÑнкÑии, Ñо var ÑÑановиÑÑÑ Ð»Ð¾ÐºÐ°Ð»Ñной пеÑеменной в ÑÑой ÑÑнкÑии:
function sayHi() {
if (true) {
var phrase = "ÐÑивеÑ";
}
alert(phrase); // ÑÑабаÑÑÐ²Ð°ÐµÑ Ð¸ вÑÐ²Ð¾Ð´Ð¸Ñ "ÐÑивеÑ"
}
sayHi();
alert(phrase); // ÐÑибка: phrase не опÑеделена (видна в конÑоли ÑазÑабоÑÑика)
Ðак Ð¼Ñ Ð²Ð¸Ð´Ð¸Ð¼, var вÑÑ
Ð¾Ð´Ð¸Ñ Ð·Ð° пÑÐµÐ´ÐµÐ»Ñ Ð±Ð»Ð¾ÐºÐ¾Ð² if, for и подобнÑÑ
. ÐÑо пÑоиÑÑ
Ð¾Ð´Ð¸Ñ Ð¿Ð¾ÑомÑ, ÑÑо на заÑе ÑазвиÑÐ¸Ñ JavaScript блоки кода не имели лекÑиÑеÑкого окÑÑжениÑ. ÐоÑÑÐ¾Ð¼Ñ Ð¼Ð¾Ð¶Ð½Ð¾ ÑказаÑÑ, ÑÑо var â ÑÑо пеÑежиÑок пÑоÑлого.
«var» допÑÑÐºÐ°ÐµÑ Ð¿Ð¾Ð²ÑоÑное обÑÑвление
ÐÑли в блоке кода Ð´Ð²Ð°Ð¶Ð´Ñ Ð¾Ð±ÑÑвиÑÑ Ð¾Ð´Ð½Ñ Ð¸ ÑÑ Ð¶Ðµ пеÑеменнÑÑ let, бÑÐ´ÐµÑ Ð¾Ñибка:
let user;
let user; // SyntaxError: 'user' has already been declared
ÐÑполÑзÑÑ var, можно пеÑеобÑÑвлÑÑÑ Ð¿ÐµÑеменнÑÑ ÑколÑко Ñгодно Ñаз. ÐовÑоÑнÑе var игноÑиÑÑÑÑÑÑ:
var user = "ÐÑÑÑ";
var user; // ниÑего не делаеÑ, пеÑÐµÐ¼ÐµÐ½Ð½Ð°Ñ Ð¾Ð±ÑÑвлена ÑанÑÑе
// ...Ð½ÐµÑ Ð¾Ñибки
alert(user); // ÐÑÑÑ
ÐÑли дополниÑелÑно пÑиÑвоиÑÑ Ð·Ð½Ð°Ñение, Ñо пеÑÐµÐ¼ÐµÐ½Ð½Ð°Ñ Ð¿ÑÐ¸Ð¼ÐµÑ Ð½Ð¾Ð²Ð¾Ðµ знаÑение:
var user = "ÐÑÑÑ";
var user = "Ðван";
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 phrase, коÑоÑÐ°Ñ Ð½Ð°Ñ
одиÑÑÑ Ð²Ð½ÑÑÑи него, поÑколÑÐºÑ Ð¾Ð±ÑÑÐ²Ð»ÐµÐ½Ð¸Ñ 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: Function statements require a function name
var message = "ÐÑивеÑ";
alert(message); // ÐÑивеÑ
}();
Ðаже еÑли Ð¼Ñ Ñкажем: Â«Ñ Ð¾ÑоÑо, давайÑе добавим имÑ», â ÑÑо не ÑÑабоÑаеÑ, поÑÐ¾Ð¼Ñ ÑÑо JavaScript не позволÑÐµÑ Ð²ÑзÑваÑÑ Function Declaration немедленно.
// оÑибка ÑинÑакÑиÑа из-за Ñкобок ниже
function go() {
}(); // <-- нелÑÐ·Ñ Ð²ÑзÑваÑÑ Function Declaration немедленно
Так ÑÑо Ñкобки вокÑÑг ÑÑнкÑии â ÑÑо ÑÑÑк, коÑоÑÑй позволÑÐµÑ Ð¾Ð±ÑÑÑниÑÑ JavaScript, ÑÑо ÑÑнкÑÐ¸Ñ Ð±Ñла Ñоздана в конÑекÑÑе дÑÑгого вÑÑажениÑ, а знаÑиÑ, ÑÑо ÑÑо Function Expression: ей не нÑжно Ð¸Ð¼Ñ Ð¸ ÐµÑ Ð¼Ð¾Ð¶Ð½Ð¾ вÑзваÑÑ Ð½ÐµÐ¼ÐµÐ´Ð»ÐµÐ½Ð½Ð¾.
Ðомимо кÑÑглÑÑ Ñкобок ÑÑÑеÑÑвÑÑÑ Ð¸ дÑÑгие ÑпоÑÐ¾Ð±Ñ ÑообÑиÑÑ JavaScript, ÑÑо Ð¼Ñ Ð¸Ð¼ÐµÐµÐ¼ в Ð²Ð¸Ð´Ñ Function Expression:
// СпоÑÐ¾Ð±Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ IIFE
(function() {
alert("ÐÑÑглÑе Ñкобки вокÑÑг ÑÑнкÑии");
})();
(function() {
alert("ÐÑÑглÑе Ñкобки вокÑÑг вÑего вÑÑажениÑ");
}());
!function() {
alert("ÐÑÑажение наÑинаеÑÑÑ Ñ Ð»Ð¾Ð³Ð¸ÑеÑкого опеÑаÑоÑа ÐÐ");
}();
+function() {
alert("ÐÑÑажение наÑинаеÑÑÑ Ñ ÑнаÑного плÑÑа");
}();
Ðо вÑÐµÑ Ð¿ÐµÑеÑиÑленнÑÑ ÑлÑÑаÑÑ Ð¼Ñ Ð¾Ð±ÑÑвлÑем Function Expression и немедленно запÑÑкаем его. ÐÑÑ Ñаз оÑмеÑим: в наÑÑоÑÑее вÑÐµÐ¼Ñ Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ÑÑи пиÑаÑÑ Ð¿Ð¾Ð´Ð¾Ð±Ð½Ñй код неÑ.
ÐÑого
СÑÑеÑÑвÑÐµÑ 2 оÑновнÑÑ
оÑлиÑÐ¸Ñ var Ð¾Ñ let/const:
- ÐеÑеменнÑе
varне имеÑÑ Ð±Ð»Ð¾Ñной облаÑÑи видимоÑÑи, они огÑаниÑенÑ, как минимÑм, Ñелом ÑÑнкÑии. - ÐбÑÑÐ²Ð»ÐµÐ½Ð¸Ñ (иниÑиализаÑиÑ) пеÑеменнÑÑ
varпÑоизводиÑÑÑ Ð² наÑале иÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÑÑнкÑии (или ÑкÑипÑа Ð´Ð»Ñ Ð³Ð»Ð¾Ð±Ð°Ð»ÑнÑÑ Ð¿ÐµÑеменнÑÑ ).
ÐÑÑÑ ÐµÑÑ Ð¾Ð´Ð½Ð¾ неболÑÑое оÑлиÑие, оÑноÑÑÑееÑÑ Ðº глобалÑÐ½Ð¾Ð¼Ñ Ð¾Ð±ÑекÑÑ, Ð¼Ñ ÑаÑÑмоÑÑим его в ÑледÑÑÑей главе.
ÐÑи оÑобенноÑÑи, как пÑавило, не оÑÐµÐ½Ñ Ñ
оÑоÑо влиÑÑÑ Ð½Ð° код. ÐлоÑÐ½Ð°Ñ Ð¾Ð±Ð»Ð°ÑÑÑ Ð²Ð¸Ð´Ð¸Ð¼Ð¾ÑÑи â ÑÑо Ñдобно. ÐоÑÑÐ¾Ð¼Ñ Ð¼Ð½Ð¾Ð³Ð¾ Ð»ÐµÑ Ð½Ð°Ð·Ð°Ð´ let и const бÑли Ð²Ð²ÐµÐ´ÐµÐ½Ñ Ð² ÑÑандаÑÑ Ð¸ ÑейÑÐ°Ñ ÑвлÑÑÑÑÑ Ð¾ÑновнÑм ÑпоÑобом обÑÑÐ²Ð»ÐµÐ½Ð¸Ñ Ð¿ÐµÑеменнÑÑ
.
ÐомменÑаÑии
<code>, Ð´Ð»Ñ Ð½ÐµÑколÑÐºÐ¸Ñ ÑÑÑок кода — Ñег<pre>, еÑли болÑÑе 10 ÑÑÑок — ÑÑÑÐ»ÐºÑ Ð½Ð° пеÑоÑниÑÑ (plnkr, JSBin, codepenâ¦)