JavaScript â Ñе дÑже ÑÑнкÑÑоналÑно оÑÑÑнÑована мова. Це Ð´Ð°Ñ Ð½Ð°Ð¼ багаÑо Ñвободи. ФÑнкÑÑÑ Ð¼Ð¾Ð¶Ð½Ð° ÑÑвоÑиÑи в бÑдÑ-Ñкий моменÑ, ÑÑ Ð¼Ð¾Ð¶Ð½Ð° пеÑедаÑи Ñк аÑгÑÐ¼ÐµÐ½Ñ ÑнÑÑй ÑÑнкÑÑÑ, а поÑÑм викликаÑи з абÑолÑÑно ÑнÑого мÑÑÑÑ ÐºÐ¾Ð´Ñ.
Ðи вже знаÑмо, Ñо ÑÑнкÑÑÑ Ð¼Ð¾Ð¶Ðµ оÑÑимаÑи доÑÑÑп до змÑÐ½Ð½Ð¸Ñ Ð· зовнÑÑнÑого ÑеÑедовиÑа (зовнÑÑÐ½Ñ Ð·Ð¼ÑннÑ).
Ðле Ñо ÑÑанеÑÑÑÑ, ÑкÑо зовнÑÑÐ½Ñ Ð·Ð¼ÑÐ½Ð½Ñ Ð·Ð¼ÑнÑÑÑÑÑ Ð¿ÑÑÐ»Ñ ÑÑвоÑÐµÐ½Ð½Ñ ÑÑнкÑÑÑ? ФÑнкÑÑÑ Ð¾ÑÑÐ¸Ð¼Ð°Ñ Ð½Ð¾Ð²Ñ Ð·Ð½Ð°ÑÐµÐ½Ð½Ñ Ñи ÑÑаÑÑ?
Ð Ñо бÑде, коли ÑÑнкÑÑÑ Ð¿ÐµÑедаÑÑÑÑÑ Ñк паÑамеÑÑ Ñ Ð²Ð¸ÐºÐ»Ð¸ÐºÐ°ÑÑÑÑÑ Ð· ÑнÑого мÑÑÑÑ ÐºÐ¾Ð´Ñ, Ñи оÑÑÐ¸Ð¼Ð°Ñ Ð²Ð¾Ð½Ð° доÑÑÑп до зовнÑÑнÑÑ Ð·Ð¼ÑÐ½Ð½Ð¸Ñ Ð½Ð° Ð½Ð¾Ð²Ð¾Ð¼Ñ Ð¼ÑÑÑÑ?
ÐавайÑе ÑозÑиÑимо наÑÑ Ð·Ð½Ð°Ð½Ð½Ñ, Ñоб зÑозÑмÑÑи ÑÑ Ñа бÑлÑÑ ÑÐºÐ»Ð°Ð´Ð½Ñ ÑÑенаÑÑÑ.
let/constУ JavaScript ÑÑнÑÑ 3 ÑпоÑоби оголоÑÐµÐ½Ð½Ñ Ð·Ð¼ÑнноÑ: let, const (ÑÑÑаÑÐ½Ñ ÑпоÑоби) Ñа var (заÑÑаÑÑлий).
- У ÑÑй ÑÑаÑÑÑ Ð¼Ð¸ бÑдемо викоÑиÑÑовÑваÑи
letÐ´Ð»Ñ Ð·Ð¼ÑÐ½Ð½Ð¸Ñ Ñ Ð¿ÑÐ¸ÐºÐ»Ð°Ð´Ð°Ñ . - ÐмÑннÑ, оголоÑÐµÐ½Ñ ÑеÑез
const, в ÑÐ¸Ñ Ð°ÑпекÑÐ°Ñ Ð¿Ð¾Ð²Ð¾Ð´ÑÑÑÑÑ Ñак Ñамо, ÑÐ¾Ð¼Ñ ÑÑ ÑÑаÑÑÑ Ñакож ÑÑоÑÑÑÑÑÑÑconst. varÐ¼Ð°Ñ Ð´ÐµÑÐºÑ Ð¿Ð¾Ð¼ÑÑÐ½Ñ Ð²ÑдмÑнноÑÑÑ, вони бÑдÑÑÑ ÑозглÑнÑÑÑ Ð² ÑÑаÑÑÑ ÐаÑÑаÑÑле клÑÑове Ñлово "var".
Ðлоки кодÑ
ЯкÑо змÑнна оголоÑена вÑеÑÐµÐ´Ð¸Ð½Ñ Ð±Ð»Ð¾ÐºÑ ÐºÐ¾Ð´Ñ {...}, вона бÑде доÑÑÑпна лиÑе вÑеÑÐµÐ´Ð¸Ð½Ñ ÑÑого блокÑ.
ÐапÑиклад:
{
// ÑÑÑ Ð²Ð¸ÐºÐ¾Ð½ÑÑÑÑÑÑ Ð¿ÐµÐ²Ð½Ð° ÑобоÑа з локалÑними змÑнними, ÑÐºÑ Ð½Ðµ ÑлÑд баÑиÑи зовнÑ
let message = "ÐÑивÑÑ"; // змÑнна, Ñка бÑде видима ÑÑлÑки Ñ ÑÑÐ¾Ð¼Ñ Ð±Ð»Ð¾ÑÑ
alert(message); // ÐÑивÑÑ
}
alert(message); // ReferenceError: message is not defined
Ðи можемо викоÑиÑÑовÑваÑи Ñе, Ñоб ÑзолÑваÑи ÑÑÐ°Ð³Ð¼ÐµÐ½Ñ ÐºÐ¾Ð´Ñ Ñазом Ñз змÑнними, ÑÐºÑ ÑÑоÑÑÑÑÑÑÑ Ð»Ð¸Ñе його:
{
// показаÑи повÑдомленнÑ
let message = "ÐÑивÑÑ";
alert(message);
}
{
// показаÑи ÑнÑе повÑдомленнÑ
let message = "ÐÑвай";
alert(message);
}
ÐÑдÑ-лаÑка, звеÑнÑÑÑ ÑвагÑ, Ñо без окÑемиÑ
блокÑв бÑде помилка, ÑкÑо ми викоÑиÑÑовÑÑмо let з Ð¾Ð´Ð½Ð°ÐºÐ¾Ð²Ð¾Ñ Ð½Ð°Ð·Ð²Ð¾Ñ Ð·Ð¼ÑнноÑ:
// показаÑи повÑдомленнÑ
let message = "ÐÑивÑÑ";
alert(message);
// показаÑи ÑнÑе повÑдомленнÑ
let message = "ÐÑвай"; // Ðомилка: змÑнна вже оголоÑена
alert(message);
ÐÐ»Ñ if, for, while Ñ Ñак далÑ, змÑннÑ, оголоÑÐµÐ½Ñ Ð² {...} Ñакож видно ÑÑлÑки вÑеÑединÑ:
if (true) {
let phrase = "ÐÑивÑÑ!";
alert(phrase); // ÐÑивÑÑ!
}
alert(phrase); // Ðомилка, за межами if ÑÐ°ÐºÐ¾Ñ Ð·Ð¼ÑÐ½Ð½Ð¾Ñ Ð½ÐµÐ¼Ð°Ñ!
ТÑÑ, пÑÑÐ»Ñ Ð·Ð°Ð²ÐµÑÑÐµÐ½Ð½Ñ if, alert нижÑе не побаÑиÑÑ phrase, оÑже, помилка.
Це ÑÑдово, оÑкÑлÑки Ñе дозволÑÑ Ð½Ð°Ð¼ ÑÑвоÑÑваÑи локалÑно-Ð±Ð»Ð¾ÐºÐ¾Ð²Ñ Ð·Ð¼ÑннÑ, ÑпеÑиÑÑÑÐ½Ñ Ð´Ð»Ñ Ð³Ñлки if.
Те ж Ñаме ÑпÑаведливо Ñ Ð´Ð»Ñ ÑиклÑв for Ñа while:
for (let i = 0; i < 3; i++) {
// змÑÐ½Ð½Ñ `i` видно ÑÑлÑки вÑеÑÐµÐ´Ð¸Ð½Ñ ÑÑого ÑÐ¸ÐºÐ»Ñ for
alert(i); // 0, поÑÑм 1, поÑÑм 2
}
alert(i); // Ðомилка, ÑÐ°ÐºÐ¾Ñ Ð·Ð¼ÑÐ½Ð½Ð¾Ñ Ð½ÐµÐ¼Ð°Ñ
ÐÑзÑалÑно, let i знаÑ
одиÑÑÑÑ Ð·Ð° межами {...}. Ðле конÑÑÑÑкÑÑÑ for оÑоблива: змÑнна, оголоÑена вÑеÑÐµÐ´Ð¸Ð½Ñ Ð½ÐµÑ, вважаÑÑÑÑÑ ÑаÑÑÐ¸Ð½Ð¾Ñ Ð±Ð»Ð¾ÐºÑ.
ÐÐºÐ»Ð°Ð´ÐµÐ½Ñ ÑÑнкÑÑÑ
ФÑнкÑÑÑ Ð½Ð°Ð·Ð¸Ð²Ð°ÑÑÑÑÑ âвкладеноÑâ (з англ. nested), коли вона ÑÑвоÑÑÑÑÑÑÑ Ð²ÑеÑÐµÐ´Ð¸Ð½Ñ ÑнÑÐ¾Ñ ÑÑнкÑÑÑ.
Ð JavaScript Ñе зÑобиÑи дÑже легко.
Рми можемо викоÑиÑÑовÑваÑи Ñе Ð´Ð»Ñ Ð¾ÑганÑзаÑÑÑ Ð½Ð°Ñого кодÑ, напÑиклад:
function sayHiBye(firstName, lastName) {
// допомÑжна вкладена ÑÑнкÑÑÑ Ð´Ð»Ñ Ð²Ð¸ÐºÐ¾ÑиÑÑÐ°Ð½Ð½Ñ Ð½Ð¸Ð¶Ñе
function getFullName() {
return firstName + " " + lastName;
}
alert( "ÐÑивÑÑ, " + getFullName() );
alert( "ÐÑвай, " + getFullName() );
}
ТÑÑ Ð²ÐºÐ»Ð°Ð´ÐµÐ½Ð° ÑÑнкÑÑÑ getFullName() ÑÑвоÑена Ð´Ð»Ñ Ð·ÑÑÑноÑÑÑ. Ðона Ð¼Ð°Ñ Ð´Ð¾ÑÑÑп до внÑÑÑÑÑнÑÑ
змÑнниÑ
ÑÑнкÑÑÑ Ñ ÑÐ¾Ð¼Ñ Ð¼Ð¾Ð¶Ðµ повеÑнÑÑи повне ÑмâÑ. ÐÐºÐ»Ð°Ð´ÐµÐ½Ñ ÑÑнкÑÑÑ Ð´Ð¾ÑиÑÑ Ð¿Ð¾ÑиÑÐµÐ½Ñ Ð² JavaScript.
Що Ñе ÑÑкавÑÑе, Ð²ÐºÐ»Ð°Ð´ÐµÐ½Ñ ÑÑнкÑÑÑ Ð¼Ð¾Ð¶Ð½Ð° повеÑнÑÑи: Ñк влаÑÑивÑÑÑÑ Ð½Ð¾Ð²Ð¾Ð³Ð¾ обâÑкÑа, або Ñк ÑамоÑÑÑйний ÑезÑлÑÑаÑ. ÐоÑÑм ÑÑ Ð¼Ð¾Ð¶Ð½Ð° викоÑиÑÑаÑи деÑÑ Ð² ÑнÑÐ¾Ð¼Ñ Ð¼ÑÑÑÑ. Ðезалежно вÑд Ñого, де ÑÑ Ð²Ð¸ÐºÐ»Ð¸ÐºÐ°ÑÑÑ, вона завжди бÑде маÑи доÑÑÑп до внÑÑÑÑÑнÑÑ Ð·Ð¼ÑÐ½Ð½Ð¸Ñ ÑÑнкÑÑÑ, в ÑкÑй ÑÑ Ð±Ñло ÑÑвоÑено.
ÐижÑе, makeCounter ÑÑвоÑÑÑ ÑÑнкÑÑÑ âcounterâ, Ñка повеÑÑÐ°Ñ Ð½Ð°ÑÑÑпний Ð½Ð¾Ð¼ÐµÑ Ð¿Ñи ÐºÐ¾Ð¶Ð½Ð¾Ð¼Ñ Ð²Ð¸ÐºÐ»Ð¸ÐºÑ:
function makeCounter() {
let count = 0;
return function() {
return count++;
};
}
let counter = makeCounter();
alert( counter() ); // 0
alert( counter() ); // 1
alert( counter() ); // 2
ÐезважаÑÑи на пÑоÑÑоÑÑ, ÑÑÐ¾Ñ Ð¸ змÑÐ½ÐµÐ½Ñ Ð²Ð°ÑÑанÑи ÑÑого ÐºÐ¾Ð´Ñ Ð¼Ð°ÑÑÑ Ð¿ÑакÑиÑне заÑÑоÑÑваннÑ, напÑиклад, генеÑаÑÐ¾Ñ Ð¿ÑÐµÐ²Ð´Ð¾Ð²Ð¸Ð¿Ð°Ð´ÐºÐ¾Ð²Ð¸Ñ ÑиÑел Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑаÑÑÑ Ð²Ð¸Ð¿Ð°Ð´ÐºÐ¾Ð²Ð¸Ñ Ð·Ð½Ð°ÑÐµÐ½Ñ Ð´Ð»Ñ Ð°Ð²ÑомаÑÐ¸Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ ÑеÑÑÑв.
Як Ñе пÑаÑÑÑ? ЯкÑо ми ÑÑвоÑимо кÑлÑка лÑÑилÑникÑв, Ñи бÑдÑÑÑ Ð²Ð¾Ð½Ð¸ незалежними? Що вÑдбÑваÑÑÑÑÑ Ð·Ñ Ð·Ð¼Ñнними ÑÑÑ?
РозÑмÑÐ½Ð½Ñ ÑÐ°ÐºÐ¸Ñ ÑеÑей ÑÑдово не ÑÑлÑки Ð´Ð»Ñ Ð·Ð°Ð³Ð°Ð»Ñного Ð·Ð½Ð°Ð½Ð½Ñ JavaScript, але й коÑиÑно Ð´Ð»Ñ ÑобоÑи з бÑлÑÑ Ñкладними ÑÑенаÑÑÑми. Тож давайÑе ÑÑÐ¾Ñ Ð¸ поглибимоÑÑ.
ÐекÑиÑне ÑеÑедовиÑе
Ðоглиблене ÑÐµÑ Ð½ÑÑне поÑÑÐ½ÐµÐ½Ð½Ñ Ð¿Ð¾Ð¿ÐµÑедÑ.
ЧеÑно кажÑÑи, поÑÑнÑÑÑи Ñе, Ñ Ñ Ð¾ÑÑв би ÑникнÑÑи низÑкоÑÑÐ²Ð½ÐµÐ²Ð¸Ñ Ð´ÐµÑалей, але без Ð½Ð¸Ñ ÑозÑмÑÐ½Ð½Ñ Ð±Ñде не повним, ÑÐ¾Ð¼Ñ Ð³Ð¾ÑÑйÑеÑÑ.
ÐÐ»Ñ Ð½Ð°Ð¾ÑноÑÑÑ Ð¿Ð¾ÑÑÐ½ÐµÐ½Ð½Ñ Ð¿Ð¾Ð´Ñлено на кÑлÑка еÑапÑв.
1 еÑап. ÐмÑннÑ
У JavaScript кожна запÑÑена ÑÑнкÑÑÑ, блок ÐºÐ¾Ð´Ñ {...}, Ñ ÑкÑÐ¸Ð¿Ñ Ð² ÑÑÐ»Ð¾Ð¼Ñ Ð¼Ð°ÑÑÑ Ð²Ð½ÑÑÑÑÑнÑй (пÑиÑ
ований) аÑоÑÑйований обâÑкÑ, вÑдомий Ñк ÐекÑиÑне ÑеÑедовиÑе (Lexical Environment).
ÐбâÑÐºÑ Ð»ÐµÐºÑиÑного ÑеÑедовиÑа ÑкладаÑÑÑÑÑ Ð· Ð´Ð²Ð¾Ñ ÑаÑÑин:
- ÐÐ°Ð¿Ð¸Ñ ÑеÑедовиÑа (Environment Record) â обâÑкÑ, Ñкий збеÑÑÐ³Ð°Ñ Ð²ÑÑ Ð»Ð¾ÐºÐ°Ð»ÑÐ½Ñ Ð·Ð¼ÑÐ½Ð½Ñ Ð² ÑкоÑÑÑ ÑвоÑÑ
влаÑÑивоÑÑей (Ñа деÑÐºÑ ÑнÑÑ ÑнÑоÑмаÑÑÑ, напÑиклад знаÑеннÑ
this). - ÐоÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° зовнÑÑÐ½Ñ Ð»ÐµÐºÑиÑне ÑеÑедовиÑе, Ñке повâÑзане Ñз зовнÑÑнÑм кодом.
âÐмÑннаâ Ñе лиÑе влаÑÑивÑÑÑÑ ÑпеÑÑалÑного внÑÑÑÑÑнÑого обâÑкÑа, ÐÐ°Ð¿Ð¸Ñ ÑеÑедовиÑа (Environment Record). âÐÑÑимаÑи або змÑниÑи змÑннÑâ ознаÑÐ°Ñ âоÑÑимаÑи або змÑниÑи влаÑÑивÑÑÑÑ ÑÑого обâÑкÑаâ.
У ÑÑÐ¾Ð¼Ñ Ð¿ÑоÑÑÐ¾Ð¼Ñ ÐºÐ¾Ð´Ñ Ð±ÐµÐ· ÑÑнкÑÑй Ñ Ð»Ð¸Ñе одне лекÑиÑне ÑеÑедовиÑе:
Це Ñак зване глобалÑне лекÑиÑне ÑеÑедовиÑе, повâÑзане з ÑÑÑм ÑкÑипÑом.
Ðа зобÑÐ°Ð¶ÐµÐ½Ð½Ñ Ð²Ð¸Ñе пÑÑмокÑÑник ознаÑÐ°Ñ Ð·Ð°Ð¿Ð¸Ñ ÑеÑедовиÑа (ÑÑ
овиÑе змÑнниÑ
), а ÑÑÑÑлка ознаÑÐ°Ñ Ð·Ð¾Ð²Ð½ÑÑÐ½Ñ Ð¿Ð¾ÑиланнÑ. ÐлобалÑне лекÑиÑне ÑеÑедовиÑе не Ð¼Ð°Ñ Ð·Ð¾Ð²Ð½ÑÑнÑого поÑиланнÑ, ÑÐ¾Ð¼Ñ ÑÑÑÑлка вказÑÑ Ð½Ð° null.
Ðоли код виконÑÑÑÑÑÑ, лекÑиÑне ÑеÑедовиÑе змÑнÑÑÑÑÑÑ.
ÐÑÑ ÑÑÐ¾Ñ Ð¸ довÑий код:
ÐÑÑмокÑÑники пÑавоÑÑÑ Ð´ÐµÐ¼Ð¾Ð½ÑÑÑÑÑÑÑ, Ñк змÑнÑÑÑÑÑÑ Ð³Ð»Ð¾Ð±Ð°Ð»Ñне лекÑиÑне ÑеÑедовиÑе пÑд ÑÐ°Ñ Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ:
- Ðоли ÑкÑÐ¸Ð¿Ñ Ð·Ð°Ð¿ÑÑкаÑÑÑÑÑ, лекÑиÑне ÑеÑедовиÑе попеÑеднÑо заповнÑÑÑÑÑÑ ÑÑÑма оголоÑеними змÑнними.
- СпоÑаÑÐºÑ Ð²Ð¾Ð½Ð¸ пеÑебÑваÑÑÑ Ñ ÑÑÐ°Ð½Ñ âÐеÑнÑÑÑалÑзованоâ (Uninitialized). Це оÑобливий внÑÑÑÑÑнÑй ÑÑан, Ñкий ознаÑаÑ, Ñо ÑÑÑÑй Ð·Ð½Ð°Ñ Ð¿Ñо змÑннÑ, але на Ð½ÐµÑ Ð½Ðµ можна поÑилаÑиÑÑ, поки вона не бÑде оголоÑена з
let. Це майже Ñе Ñаме, нÑби змÑнна не ÑÑнÑÑ.
- СпоÑаÑÐºÑ Ð²Ð¾Ð½Ð¸ пеÑебÑваÑÑÑ Ñ ÑÑÐ°Ð½Ñ âÐеÑнÑÑÑалÑзованоâ (Uninitialized). Це оÑобливий внÑÑÑÑÑнÑй ÑÑан, Ñкий ознаÑаÑ, Ñо ÑÑÑÑй Ð·Ð½Ð°Ñ Ð¿Ñо змÑннÑ, але на Ð½ÐµÑ Ð½Ðµ можна поÑилаÑиÑÑ, поки вона не бÑде оголоÑена з
- ÐоÑÑм зâÑвлÑÑÑÑÑÑ Ð¾Ð³Ð¾Ð»Ð¾ÑÐµÐ½Ð½Ñ Ð·Ð¼ÑнноÑ
let phrase. Ðоки Ñо ми ÑÑлÑки оголоÑили змÑннÑ, ÑÐ¾Ð¼Ñ ÑÑ Ð·Ð½Ð°ÑеннÑundefined. Ðле з ÑÑого моменÑÑ Ð¼Ð¸ можемо викоÑиÑÑовÑваÑи ÑÑ. phraseпÑиÑвоÑÑÑÑÑÑ Ð·Ð½Ð°ÑеннÑ.phraseзмÑнÑÑ Ð·Ð½Ð°ÑеннÑ.
Ðоки Ñо вÑе виглÑÐ´Ð°Ñ Ð¿ÑоÑÑо, пÑавда?
- ÐмÑнна â Ñе влаÑÑивÑÑÑÑ ÑпеÑÑалÑного внÑÑÑÑÑнÑого обâÑкÑа, повâÑзана з блоком/ÑÑнкÑÑÑÑ/ÑкÑипÑом Ñо заÑаз виконÑÑÑÑÑÑ.
- РобоÑа Ð·Ñ Ð·Ð¼Ñнними â Ñе наÑпÑÐ°Ð²Ð´Ñ ÑобоÑа з влаÑÑивоÑÑÑми ÑÑого обâÑкÑа.
âÐекÑиÑне ÑеÑедовиÑеâ â Ñе обâÑÐºÑ ÑпеÑиÑÑкаÑÑÑ: вÑн ÑÑнÑÑ Ð»Ð¸Ñе âÑеоÑеÑиÑноâ в ÑпеÑиÑÑкаÑÑÑ Ð¼Ð¾Ð²Ð¸ Ñоб показаÑи, Ñк вÑе пÑаÑÑÑ. Ðи не можемо оÑÑимаÑи Ñей обâÑÐºÑ Ñ Ð½Ð°ÑÐ¾Ð¼Ñ ÐºÐ¾Ð´Ñ Ñа кеÑÑваÑи ним безпоÑеÑеднÑо.
Також ÑÑÑÑÑ JavaScript можÑÑÑ Ð¹Ð¾Ð³Ð¾ опÑимÑзовÑваÑи, вÑдкидаÑи змÑннÑ, ÑÐºÑ Ð½Ðµ викоÑиÑÑовÑÑÑÑÑÑ Ð´Ð»Ñ ÐµÐºÐ¾Ð½Ð¾Ð¼ÑÑ Ð¿Ð°Ð¼âÑÑÑ Ñа виконÑваÑи ÑнÑÑ Ð²Ð½ÑÑÑÑÑÐ½Ñ ÑÑÑки, доки видима поведÑнка залиÑаÑÑÑÑÑ ÑакоÑ, Ñк опиÑано Ñ ÑпеÑиÑÑкаÑÑÑ.
2 еÑап. ФÑнкÑÑÑ ÑÑвоÑÐµÐ½Ñ Ñк Function Declarations
ФÑнкÑÑÑ Ñакож Ñ Ð·Ð½Ð°ÑеннÑм, Ñк Ñ Ð·Ð½Ð°ÑÐµÐ½Ð½Ñ Ð²ÑеÑÐµÐ´Ð¸Ð½Ñ Ð·Ð¼ÑÐ½Ð½Ð¸Ñ .
Ð ÑзниÑÑ Ð² ÑомÑ, Ñо ÑÑнкÑÑÑ ÑÑвоÑена за Ð´Ð¾Ð¿Ð¾Ð¼Ð¾Ð³Ð¾Ñ Function Declaration, ÑнÑÑÑалÑзÑÑÑÑÑÑ Ð¼Ð¸ÑÑÑво Ñ Ð¿Ð¾Ð²Ð½ÑÑÑÑ.
Ðоли ÑÑвоÑÑÑÑÑÑÑ Ð»ÐµÐºÑиÑне ÑеÑедовиÑе, Ñака ÑÑнкÑÑÑ Ð²ÑдÑÐ°Ð·Ñ ÑÑÐ°Ñ Ð³Ð¾ÑÐ¾Ð²Ð¾Ñ Ð´Ð¾ викоÑиÑÑÐ°Ð½Ð½Ñ (на вÑдмÑÐ½Ñ Ð²Ñд знаÑÐµÐ½Ð½Ñ Ñ Ð·Ð¼ÑннÑй let, Ñо непÑидаÑна Ð´Ð»Ñ Ð²Ð¸ÐºÐ¾ÑÑÑÐ¸Ð½Ð½Ñ Ð´Ð¾ оголоÑеннÑ).
ÐÑÑ ÑÐ¾Ð¼Ñ Ð¼Ð¸ можемо викоÑиÑÑовÑваÑи ÑÑнкÑÑÑ, оголоÑÐµÐ½Ñ Ð· Function Declaration, Ñе до ÑÑдка з оголоÑеннÑм.
ÐапÑиклад, оÑÑ Ð¿Ð¾ÑаÑковий ÑÑан глобалÑного лекÑиÑного ÑеÑедовиÑа, коли ми додаÑмо ÑÑнкÑÑÑ:
Така поведÑнка ÑÑоÑÑÑÑÑÑÑ Ð»Ð¸Ñе Function Declarations, а не Function Expressions, де ми пÑизнаÑаÑмо ÑÑнкÑÑÑ Ð·Ð¼ÑннÑй, напÑиклад оÑÑ Ñак let say = function(name)....
3 еÑап. ÐнÑÑÑÑÑÐ½Ñ Ñа зовнÑÑÐ½Ñ Ð»ÐµÐºÑиÑне ÑеÑедовиÑе
Ðоли ÑÑнкÑÑÑ Ð²Ð¸ÐºÐ¾Ð½ÑÑÑÑÑÑ, на поÑаÑÐºÑ Ð²Ð¸ÐºÐ»Ð¸ÐºÑ Ð°Ð²ÑомаÑиÑно ÑÑвоÑÑÑÑÑÑÑ Ð½Ð¾Ð²Ðµ лекÑиÑне ÑеÑедовиÑе Ð´Ð»Ñ Ð·Ð±ÐµÑÑÐ³Ð°Ð½Ð½Ñ Ð»Ð¾ÐºÐ°Ð»ÑÐ½Ð¸Ñ Ð·Ð¼ÑÐ½Ð½Ð¸Ñ Ñа паÑамеÑÑÑв викликÑ.
ÐапÑиклад, Ð´Ð»Ñ say("John"), Ñе виглÑÐ´Ð°Ñ Ñак (Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ Ð·Ð½Ð°Ñ
одиÑÑÑÑ Ñ ÑÑдкÑ, познаÑÐµÐ½Ð¾Ð¼Ñ ÑÑÑÑлкоÑ):
ÐÑд ÑÐ°Ñ Ð²Ð¸ÐºÐ»Ð¸ÐºÑ ÑÑнкÑÑÑ Ñ Ð½Ð°Ñ Ñ Ð´Ð²Ð° лекÑиÑÐ½Ñ ÑеÑедовиÑа: внÑÑÑÑÑÐ½Ñ (Ð´Ð»Ñ Ð²Ð¸ÐºÐ»Ð¸ÐºÑ ÑÑнкÑÑÑ) Ñ Ð·Ð¾Ð²Ð½ÑÑÐ½Ñ (глобалÑне):
- ÐнÑÑÑÑÑÐ½Ñ Ð»ÐµÐºÑиÑне ÑеÑедовиÑе вÑдповÑÐ´Ð°Ñ Ð¿Ð¾ÑоÑÐ½Ð¾Ð¼Ñ Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ ÑÑнкÑÑÑ
say. Ðоно Ð¼Ð°Ñ ÑÐ´Ð¸Ð½Ñ Ð²Ð»Ð°ÑÑивÑÑÑÑ:nameâ аÑгÑÐ¼ÐµÐ½Ñ ÑÑнкÑÑÑ. Ðи викликалиsay("John"), Ñож знаÑÐµÐ½Ð½Ñ ÑnameбÑде"John". - ÐовнÑÑÐ½Ñ Ð»ÐµÐºÑиÑне ÑеÑедовиÑе â Ñе глобалÑне лекÑиÑне ÑеÑедовиÑе. У нÑÐ¾Ð¼Ñ Ñ Ð·Ð¼Ñнна
phraseÑа Ñама ÑÑнкÑÑÑ.
ÐнÑÑÑÑÑÐ½Ñ Ð»ÐµÐºÑиÑне ÑеÑедовиÑе Ð¼Ð°Ñ Ð¿Ð¾ÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° зовнÑÑнÑ.
Ðоли код Ñ Ð¾Ñе оÑÑимаÑи доÑÑÑп до змÑÐ½Ð½Ð¾Ñ â ÑпоÑаÑÐºÑ ÑÑÐºÐ°Ñ ÑÑ Ñ Ð²Ð½ÑÑÑÑÑнÑÐ¾Ð¼Ñ Ð»ÐµÐºÑиÑÐ½Ð¾Ð¼Ñ ÑеÑедовиÑÑ, поÑÑм Ñ Ð·Ð¾Ð²Ð½ÑÑнÑомÑ, поÑÑм Ñ Ð·Ð¾Ð²Ð½ÑÑнÑÐ¾Ð¼Ñ Ð´Ð¾ попеÑеднÑого Ñ Ñак Ð´Ð°Ð»Ñ Ð¿Ð¾ÐºÐ¸ не дÑйде до глобалÑного.
ЯкÑо змÑнна нÑде не знайдена, Ñо пÑи "use strict" бÑде помилка (без use strict пÑиÑвоÑÐ½Ð½Ñ Ð½ÐµÑÑнÑÑÑÐ¾Ñ Ð·Ð¼ÑÐ½Ð½Ð¾Ñ ÑÑвоÑÑÑ Ð½Ð¾Ð²Ñ Ð³Ð»Ð¾Ð±Ð°Ð»ÑÐ½Ñ Ð·Ð¼ÑÐ½Ð½Ñ Ð´Ð»Ñ ÑÑмÑÑноÑÑÑ Ð·Ñ ÑÑаÑим кодом).
У ÑÑÐ¾Ð¼Ñ Ð¿ÑÐ¸ÐºÐ»Ð°Ð´Ñ Ð¿Ð¾ÑÑк вÑдбÑваÑÑÑÑÑ Ð½Ð°ÑÑÑпним Ñином:
- ÐÐ»Ñ Ð·Ð¼ÑнноÑ
name,alertÑ ÑÑнкÑÑÑsayÐ·Ð½Ð°Ñ Ð¾Ð´Ð¸ÑÑ ÑÑ Ð½ÐµÐ³Ð°Ð¹Ð½Ð¾ Ñ Ð²Ð½ÑÑÑÑÑнÑÐ¾Ð¼Ñ Ð»ÐµÐºÑиÑÐ½Ð¾Ð¼Ñ ÑеÑедовиÑÑ. - Ðоли вона Ñ
оÑе оÑÑимаÑи доÑÑÑп до
phrase, вона ÑпоÑаÑÐºÑ ÑÑÐºÐ°Ñ ÑÑ ÑеÑед локалÑÐ½Ð¸Ñ Ð·Ð¼ÑÐ½Ð½Ð¸Ñ , де ÑÑ Ð½ÐµÐ¼Ð°Ñ, Ñ Ð²ÑеÑÑÑ ÑеÑÑ Ñде за поÑиланнÑм на зовнÑÑÐ½Ñ Ð»ÐµÐºÑиÑне ÑеÑедовиÑе Ñ Ð·Ð½Ð°Ñ Ð¾Ð´Ð¸ÑÑ ÑÑ Ñам.
4 еÑап. ÐовеÑÐ½ÐµÐ½Ð½Ñ ÑÑнкÑÑÑ
ÐовеÑнемоÑÑ Ð´Ð¾ пÑÐ¸ÐºÐ»Ð°Ð´Ñ Ð· makeCounter.
function makeCounter() {
let count = 0;
return function() {
return count++;
};
}
let counter = makeCounter();
Ðа поÑаÑÐºÑ ÐºÐ¾Ð¶Ð½Ð¾Ð³Ð¾ Ð²Ð¸ÐºÐ»Ð¸ÐºÑ makeCounter(), ÑÑвоÑÑÑÑÑÑÑ Ð½Ð¾Ð²Ð¸Ð¹ обâÑÐºÑ Ð»ÐµÐºÑиÑного ÑеÑедовиÑа Ð´Ð»Ñ Ð·Ð±ÐµÑÑÐ³Ð°Ð½Ð½Ñ Ð·Ð¼ÑнниÑ
конкÑеÑного Ð²Ð¸ÐºÐ»Ð¸ÐºÑ makeCounter.
ÐÑже, Ñ Ð½Ð°Ñ Ñ Ð´Ð²Ð° Ð²ÐºÐ»Ð°Ð´ÐµÐ½Ð¸Ñ Ð»ÐµÐºÑиÑÐ½Ð¸Ñ ÑеÑедовиÑа, Ñк Ñ Ñ Ð¿ÑÐ¸ÐºÐ»Ð°Ð´Ñ Ð²Ð¸Ñе:
Ð ÑзниÑÑ Ð¿Ð¾Ð»ÑÐ³Ð°Ñ Ð² ÑомÑ, Ñо пÑд ÑÐ°Ñ Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ makeCounter(), ÑÑвоÑÑÑÑÑÑÑ ÐºÑиÑ
ÑÑна вкладена ÑÑнкÑÑÑ, Ñка ÑкладаÑÑÑÑÑ Ð»Ð¸Ñе з одного ÑÑдка: return count++. Ðи не запÑÑкаÑмо ÑÑ, лиÑе ÑÑвоÑÑÑмо.
УÑÑ ÑÑнкÑÑÑ Ð¿Ð°Ð¼âÑÑаÑÑÑ Ð»ÐµÐºÑиÑне ÑеÑедовиÑе, в ÑÐºÐ¾Ð¼Ñ Ð²Ð¾Ð½Ð¸ бÑли ÑÑвоÑенÑ. ТеÑ
нÑÑно ÑÑÑ Ð½ÐµÐ¼Ð°Ñ Ð½ÑÑÐºÐ¾Ñ Ð¼Ð°Ð³ÑÑ: ÑÑÑ ÑÑнкÑÑÑ Ð¼Ð°ÑÑÑ Ð¿ÑиÑ
Ð¾Ð²Ð°Ð½Ñ Ð²Ð»Ð°ÑÑивÑÑÑÑ Ð· Ð½Ð°Ð·Ð²Ð¾Ñ [[Environment]], Ñо збеÑÑÐ³Ð°Ñ Ð¿Ð¾ÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° лекÑиÑне ÑеÑедовиÑе, де бÑла ÑÑвоÑена ÑÑнкÑÑÑ:
ТомÑ, counter.[[Environment]] Ð¼Ð°Ñ Ð¿Ð¾ÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° лекÑиÑне ÑеÑедовиÑе, Ñке Ð¼Ð°Ñ Ð²Ð¸Ð³Ð»Ñд {count: 0}. Так ÑÑнкÑÑÑ Ð·Ð°Ð¿Ð°Ð¼âÑÑовÑÑ, де вона бÑла ÑÑвоÑена, незалежно вÑд Ñого, де вона викликаÑÑÑÑÑ. ÐоÑÐ¸Ð»Ð°Ð½Ð½Ñ Ñ [[Environment]] вÑÑановлÑÑÑÑÑÑ Ñаз Ñ Ð½Ð°Ð·Ð°Ð²Ð¶Ð´Ð¸ пÑд ÑÐ°Ñ ÑÑвоÑÐµÐ½Ð½Ñ ÑÑнкÑÑÑ.
ÐÑзнÑÑе коли counter() викликаÑÑÑÑÑ, Ð´Ð»Ñ Ð²Ð¸ÐºÐ»Ð¸ÐºÑ ÑÑвоÑÑÑÑÑÑÑ Ð½Ð¾Ð²Ðµ лекÑиÑне ÑеÑедовиÑе, а поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° зовнÑÑÐ½Ñ Ð»ÐµÐºÑиÑне ÑеÑедовиÑе Ð´Ð»Ñ Ð½Ñого беÑеÑÑÑÑ Ð· counter.[[Environment]]:
ТепеÑ, коли код вÑеÑÐµÐ´Ð¸Ð½Ñ counter() ÑÑÐºÐ°Ñ Ð·Ð¼ÑÐ½Ð½Ñ count, вÑн ÑпоÑаÑÐºÑ ÑÑÐºÐ°Ñ Ñ Ð²Ð»Ð°ÑÐ½Ð¾Ð¼Ñ Ð»ÐµÐºÑиÑÐ½Ð¾Ð¼Ñ ÑеÑедовиÑÑ (воно поÑожнÑ, оÑкÑлÑки Ñам Ð½ÐµÐ¼Ð°Ñ Ð»Ð¾ÐºÐ°Ð»ÑниÑ
змÑнниÑ
), поÑÑм Ñ Ð·Ð¾Ð²Ð½ÑÑнÑÐ¾Ð¼Ñ Ð»ÐµÐºÑиÑÐ½Ð¾Ð¼Ñ ÑеÑедовиÑÑ Ð²Ð¸ÐºÐ»Ð¸ÐºÑ makeCounter(), де вÑн ÑÑ Ð·Ð½Ð°Ñ
одиÑÑ Ñ Ð·Ð¼ÑнÑÑ.
ÐмÑнна оновлÑÑÑÑÑÑ Ð² лекÑиÑÐ½Ð¾Ð¼Ñ ÑеÑедовиÑÑ, де вона ÑÑнÑÑ.
ÐÑÑ ÑÑан пÑÑÐ»Ñ Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ:
ЯкÑо ми викликаÑмо counter() кÑлÑка ÑазÑв, змÑнна count бÑде збÑлÑÑена до 2, 3 Ñ Ñак далÑ, в Ð¾Ð´Ð½Ð¾Ð¼Ñ Ð¼ÑÑÑÑ.
У пÑогÑамÑÐ²Ð°Ð½Ð½Ñ ÑÑнÑÑ Ð·Ð°Ð³Ð°Ð»Ñний ÑеÑмÑн âзамиканнÑâ, Ñкий ÑозÑобники зазвиÑай маÑÑÑ Ð·Ð½Ð°Ñи.
ÐÐ°Ð¼Ð¸ÐºÐ°Ð½Ð½Ñ â Ñе ÑÑнкÑÑÑ, Ñка запамâÑÑовÑÑ ÑÐ²Ð¾Ñ Ð·Ð¾Ð²Ð½ÑÑÐ½Ñ Ð·Ð¼ÑÐ½Ð½Ñ Ñа може оÑÑимаÑи до Ð½Ð¸Ñ Ð´Ð¾ÑÑÑп. У деÑÐºÐ¸Ñ Ð¼Ð¾Ð²Ð°Ñ Ñе зовÑÑм неможливо, або ÑÑнкÑÑÑ Ð¼Ð°Ñ Ð±ÑÑи напиÑана оÑобливим Ñином. Ðле, Ñк поÑÑнÑвалоÑÑ Ð²Ð¸Ñе, в JavaScript Ð·Ð°Ð¼Ð¸ÐºÐ°Ð½Ð½Ñ Ð´Ð»Ñ ÑÑнкÑÑÑ â Ñе пÑиÑоднÑо Ñ Ð½Ðµ поÑÑебÑÑ Ð¶Ð¾Ð´Ð½Ð¸Ñ Ð·ÑÑÐ¸Ð»Ñ (Ñ Ð»Ð¸Ñе один винÑÑок, Ñкий ми ÑозглÑнемо Ñ Ð¡Ð¸Ð½ÑакÑÐ¸Ñ "new Function").
ТобÑо: ÑÑнкÑÑÑ Ð°Ð²ÑомаÑиÑно запамâÑÑовÑÑÑÑ, де вони бÑли ÑÑвоÑенÑ, викоÑиÑÑовÑÑÑи пÑиÑ
Ð¾Ð²Ð°Ð½Ñ Ð²Ð»Ð°ÑÑивÑÑÑÑ [[Environment]], а поÑÑм ÑÑ
нÑй код може оÑÑимаÑи доÑÑÑп до зовнÑÑнÑÑ
змÑнниÑ
.
Ðоли пÑд ÑÐ°Ñ ÑпÑвбеÑÑди ÑозÑобник оÑÑимÑÑ Ð·Ð°Ð¿Ð¸ÑÐ°Ð½Ð½Ñ âÑо Ñаке замиканнÑ?â, пÑавилÑÐ½Ð¾Ñ Ð²ÑдповÑÐ´Ð´Ñ Ð±Ñде визнаÑÐµÐ½Ð½Ñ Ð·Ð°Ð¼Ð¸ÐºÐ°Ð½Ð½Ñ Ñа поÑÑненнÑ, Ñо вÑÑ ÑÑнкÑÑÑ Ð² JavaScript Ñ Ð·Ð°Ð¼Ð¸ÐºÐ°Ð½Ð½Ñми, Ñ, можливо, Ñе кÑлÑка ÑлÑв пÑо ÑеÑ
нÑÑÐ½Ñ Ð´ÐµÑалÑ: влаÑÑивÑÑÑÑ [[Environment]], Ñ Ñк Ð²Ð·Ð°Ð³Ð°Ð»Ñ Ð¿ÑаÑÑÑÑÑ Ð»ÐµÐºÑиÑÐ½Ñ ÑеÑедовиÑа.
ÐбиÑÐ°Ð½Ð½Ñ ÑмÑÑÑÑ
ÐазвиÑай пÑÑÐ»Ñ Ð·Ð°Ð²ÐµÑÑÐµÐ½Ð½Ñ Ð²Ð¸ÐºÐ»Ð¸ÐºÑ ÑÑнкÑÑÑ Ð· памâÑÑÑ Ð²Ð¸Ð´Ð°Ð»ÑÑÑÑÑÑ ÑÑ Ð»ÐµÐºÑиÑне ÑеÑедовиÑе з ÑÑÑма змÑнними. Це ÑомÑ, Ñо Ð½ÐµÐ¼Ð°Ñ Ð¿Ð¾ÑÐ¸Ð»Ð°Ð½Ñ Ð½Ð° нÑого. Як Ñ Ð±ÑдÑ-Ñкий обâÑÐºÑ JavaScript, вÑн збеÑÑгаÑÑÑÑÑ Ð² памâÑÑÑ Ð»Ð¸Ñе ÑодÑ, коли вÑн доÑÑжний.
Ðднак, ÑкÑо Ñ Ð²ÐºÐ»Ð°Ð´ÐµÐ½Ð° ÑÑнкÑÑÑ, Ñка вÑе Ñе доÑÑÑпна пÑÑÐ»Ñ Ð·Ð°Ð²ÐµÑÑÐµÐ½Ð½Ñ Ð²Ð¸ÐºÐ»Ð¸ÐºÑ Ð¾ÑÐ½Ð¾Ð²Ð½Ð¾Ñ ÑÑнкÑÑÑ, Ñо вона Ð¼Ð°Ñ Ð²Ð»Ð°ÑÑивÑÑÑÑ [[Environment]], Ñка поÑилаÑÑÑÑÑ Ð½Ð° лекÑиÑне ÑеÑедовиÑе, ÑÑвоÑене пÑд ÑÐ°Ñ Ð²Ð¸ÐºÐ»Ð¸ÐºÑ.
У ÑÑÐ¾Ð¼Ñ Ð²Ð¸Ð¿Ð°Ð´ÐºÑ Ð»ÐµÐºÑиÑне ÑеÑедовиÑе вÑе Ñе доÑÑÑпне навÑÑÑ Ð¿ÑÑÐ»Ñ Ð·Ð°Ð²ÐµÑÑÐµÐ½Ð½Ñ ÑÑнкÑÑÑ, ÑÐ¾Ð¼Ñ Ð²Ð¾Ð½Ð¾ залиÑаÑÑÑÑÑ âживимâ.
ÐапÑиклад:
function f() {
let value = 123;
return function() {
alert(value);
}
}
let g = f(); // g.[[Environment]] збеÑÑÐ³Ð°Ñ Ð¿Ð¾ÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° лекÑиÑне ÑеÑедовиÑе
// вÑдповÑдного Ð²Ð¸ÐºÐ»Ð¸ÐºÑ f()
ÐвеÑнÑÑÑ ÑвагÑ, Ñо ÑкÑо f() викликаÑÑÑÑÑ Ð±Ð°Ð³Ð°Ñо ÑазÑв, а оÑÑÐ¸Ð¼Ð°Ð½Ñ ÑÑнкÑÑÑ Ð·Ð±ÐµÑÑгаÑÑÑÑÑ, ÑÐ¾Ð´Ñ Ð²ÑÑ Ð²ÑдповÑÐ´Ð½Ñ Ð¾Ð±âÑкÑи лекÑиÑного ÑеÑедовиÑа Ñакож бÑдÑÑÑ Ð·Ð±ÐµÑÐµÐ¶ÐµÐ½Ñ Ð² памâÑÑÑ. У ÐºÐ¾Ð´Ñ Ð½Ð¸Ð¶Ñе збеÑÐµÐ¶ÐµÐ½Ñ Ð²ÑÑ ÑÑи:
function f() {
let value = Math.random();
return function() { alert(value); };
}
// ÑÑи ÑÑнкÑÑÑ Ð² маÑивÑ, кожна з ÑкиÑ
повâÑзана з лекÑиÑним ÑеÑедовиÑем
// вÑдповÑдного Ð²Ð¸ÐºÐ»Ð¸ÐºÑ f()
let arr = [f(), f(), f()];
ÐбâÑÐºÑ Ð»ÐµÐºÑиÑного ÑеÑедовиÑа âвмиÑаÑâ, коли ÑÑÐ°Ñ Ð½ÐµÐ´Ð¾ÑÑжним (Ñк Ñ Ð±ÑдÑ-Ñкий ÑнÑий обâÑкÑ). ÐнÑими Ñловами, вÑн ÑÑнÑÑ Ð»Ð¸Ñе ÑодÑ, коли на нÑого поÑилаÑÑÑÑÑ Ð¿ÑÐ¸Ð½Ð°Ð¹Ð¼Ð½Ñ Ð¾Ð´Ð½Ð° вкладена ÑÑнкÑÑÑ.
У Ð½Ð°Ð²ÐµÐ´ÐµÐ½Ð¾Ð¼Ñ Ð½Ð¸Ð¶Ñе ÐºÐ¾Ð´Ñ Ð¿ÑÑÐ»Ñ Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð²ÐºÐ»Ð°Ð´ÐµÐ½Ð¾Ñ ÑÑнкÑÑÑ, лекÑиÑне ÑеÑедовиÑе, до Ñкого вона мала доÑÑÑп, Ñакож ÑÑиÑаÑÑÑÑÑ Ð· памâÑÑÑ:
function f() {
let value = 123;
return function() {
alert(value);
}
}
let g = f(); // поки ÑÑнкÑÑÑ g ÑÑнÑÑ, знаÑÐµÐ½Ð½Ñ Ð·Ð°Ð»Ð¸ÑаÑÑÑÑÑ Ð² памâÑÑÑ
g = null; // ...Ñ ÑÐµÐ¿ÐµÑ Ð¿Ð°Ð¼âÑÑÑ Ð¾ÑиÑена
ÐпÑимÑзаÑÑÑ Ð² ÑеалÑÐ½Ð¾Ð¼Ñ Ð¶Ð¸ÑÑÑ
Як ми баÑили, ÑеоÑеÑиÑно, поки ÑÑнкÑÑÑ âживаâ, вÑÑ Ð·Ð¾Ð²Ð½ÑÑÐ½Ñ Ð·Ð¼ÑÐ½Ð½Ñ Ñакож збеÑÑгаÑÑÑÑÑ.
Ðле на пÑакÑиÑÑ ÑÑÑÑÑ JavaScript намагаÑÑÑÑÑ Ð¾Ð¿ÑимÑзÑваÑи Ñе. Ðони аналÑзÑÑÑÑ Ð²Ð¸ÐºÐ¾ÑиÑÑÐ°Ð½Ð½Ñ Ð·Ð¼ÑÐ½Ð½Ð¸Ñ , Ñ ÑкÑо з ÐºÐ¾Ð´Ñ Ð¾Ñевидно, Ñо зовнÑÑÐ½Ñ Ð·Ð¼Ñнна не викоÑиÑÑовÑÑÑÑÑÑ â вона видалÑÑÑÑÑÑ.
Ðажливим побÑÑним еÑекÑом Ñ ÑÑÑÑÑ V8 (Chrome, Edge, Opera) Ñ Ñе, Ñо Ñака змÑнна ÑÑане недоÑÑÑÐ¿Ð½Ð¾Ñ Ð¿Ñд ÑÐ°Ñ Ð½Ð°Ð»Ð°Ð³Ð¾Ð´Ð¶ÐµÐ½Ð½Ñ.
СпÑобÑйÑе запÑÑÑиÑи наведений нижÑе пÑиклад Ñ Chrome Ñз вÑдкÑиÑими ÑнÑÑÑÑменÑами ÑозÑобника.
Ðоли вÑн пÑизÑпинÑÑÑÑÑÑ Ð½Ð° debugger, в конÑÐ¾Ð»Ñ Ð²Ð²ÐµÐ´ÑÑÑ alert(value).
function f() {
let value = Math.random();
function g() {
debugger; // в конÑÐ¾Ð»Ñ Ð²Ð²ÐµÐ´ÑÑÑ: alert(value); Ñ Ð²Ð¸ побаÑиÑе, Ñо ÑÐ°ÐºÐ¾Ñ Ð·Ð¼ÑÐ½Ð½Ð¾Ñ Ð½ÐµÐ¼Ð°Ñ!
}
return g;
}
let g = f();
g();
Як баÑиÑе, ÑÐ°ÐºÐ¾Ñ Ð·Ð¼ÑÐ½Ð½Ð¾Ñ Ð½ÐµÐ¼Ð°Ñ! ТеоÑеÑиÑно вона повинна бÑÑи доÑÑÑпноÑ, але ÑÑÑÑй Ñе опÑимÑзÑвав.
Це може пÑизвеÑÑи до ÑмÑÑÐ½Ð¸Ñ (ÑкÑо не ÑÐ°ÐºÐ¸Ñ ÑÑÑдомÑÑÑÐºÐ¸Ñ ) пÑоблем з налагодженнÑм. Ðдна з Ð½Ð¸Ñ â ми можемо побаÑиÑи зовнÑÑÐ½Ñ Ð·Ð¼ÑÐ½Ð½Ñ Ð· ÑÐ°ÐºÐ¾Ñ Ð¶ Ð½Ð°Ð·Ð²Ð¾Ñ Ð·Ð°Ð¼ÑÑÑÑ Ð¾ÑÑкÑваноÑ:
let value = "СÑÑпÑиз!";
function f() {
let value = "найближÑе знаÑеннÑ";
function g() {
debugger; // в конÑÐ¾Ð»Ñ Ð²Ð²ÐµÐ´ÑÑÑ: alert(value); СÑÑпÑиз!
}
return g;
}
let g = f();
g();
Ð¦Ñ Ð¾ÑобливÑÑÑÑ V8 коÑиÑно знаÑи. ЯкÑо ви налагоджÑÑÑе ÑвÑй код Ñ Chrome/Edge/Opera, Ñано Ñи пÑзно ви ÑÑ Ð·ÑÑÑÑÑнеÑе.
Це не помилка, а ÑкоÑÑÑе оÑобливÑÑÑÑ V8. Ðожливо, колиÑÑ Ñе бÑде змÑнено. Ðи завжди можеÑе пеÑевÑÑиÑи Ñе, запÑÑÑивÑи пÑиклади на ÑÑй ÑÑоÑÑнÑÑ.
ÐоменÑаÑÑ
<code>, Ð´Ð»Ñ ÐºÑлÑÐºÐ¾Ñ ÑÑдкÑв â обгоÑнÑÑÑ ÑÑ Ñегом<pre>, Ð´Ð»Ñ Ð¿Ð¾Ð½Ð°Ð´ 10 ÑÑдкÑв â викоÑиÑÑовÑйÑе пÑÑоÑниÑÑ (plnkr, jsbin, codepenâ¦)