Hoisting bilan qiziqarli

Bugungi TL; DR seriyasida biz yuk ko'tarish haqida gaplashamiz. "TL; DR seriyasi" haqida ko'proq bilish uchun bu yerni bosing.

JavaScript-da var yordamida barcha o'zgaruvchilar deklaratsiyasi uning funksiya doirasi yoki global qamrovining yuqori qismiga ko'tariladi. Mana asosiy qoidalar:

  • Funktsiya deklaratsiyasi o'zgaruvchan deklaratsiyalar ustiga ko'tariladi.
  • Funktsiya ifodalari ko'tarilmaydi.
  • O'zgaruvchan topshiriqlar ko'tarilmaydi.
  • E'lon qilinishidan oldin qiymat berilgan o'zgaruvchilar avtomatik ravishda global qamrovning bir qismidir.
  • Deklaratsiyalar kod bloklarida emas, balki funksiya bloklarining yuqori qismida joylashgan

Funktsiya deklaratsiyasi o'zgaruvchan deklaratsiyalar ustiga ko'tariladi.

Ko'tarish amalga oshirilgandan so'ng, u quyidagicha ko'rinadi:

function foo(){};
var foo;
console.log(typeof foo)

O'chirish deklaratsiyalarni kod bloklarining tepasiga ko'chiradi

Chiqish aniqlanmagan! Buning sababi, var x; if bloki ichida funktsiyaning yuqori qismiga ko'tariladi. X=1 topshirig'i if blokida saqlanadi, shuning uchun x ga hech qachon qiymat berilmaydi. Ko'tarilgandan so'ng, kod quyidagicha ko'rinadi:

function foo(){
    var x;
    if (false){
        x = 1;
    }
    console.log(x);

Esda tutingki, o'zgaruvchan topshiriq ko'tarilmaydi

Ko'tarilgandan so'ng, kod quyidagicha talqin qilinadi:

var foo;
function foo(){};
foo = "abc";

O'zgaruvchan topshiriqlar ko'tarilmaydi

Ko'tarilgandan so'ng, kod quyidagicha talqin qilinadi:

var bar;
console.log(bar);
bar = "abc";
console.log(bar);

Funksiya iboralari ko'tarilmaydi

Global miqyosdan ehtiyot bo'ling

Nima uchun “def”? Keling, avval nima bo'lishini ko'rib chiqaylik. barfunktsiya deklaratsiyasi faylning tepasiga ko'tarilib, so'ngra var foo. foo qiymatiga “def” tayinlanadi, lekin bar() chaqirilganda, foo qiymati “def” bilan belgilanadi. foo bar()funksiyasida lokal ravishda e'lon qilinmaganligi sababli, bu erda foo o'zgaruvchisi global miqyosda bir xil foo o'zgaruvchisidir. Shuning uchun konsolda “def” chop etiladi.

“qattiq foydalanish”

«Qat'iy foydalanish»ni e'lon qilish; skript boshida e'lon qilinishidan oldin o'zgaruvchilarni belgilashga ruxsat bermaydi. Uni qo'llash orqali ko'tarish bilan bog'liq muammolarning oldini olish mumkin.

Yuk ko'tarish bilan bog'liq JavaScript o'zgaruvchan doirasi tushunchasi. Ikkalasi o'zaro bog'liq va siz allaqachon payqaganingizdek, yuk ko'tarish va ko'lam haqida noto'g'ri tushunish juda yomon xatolarga olib kelishi mumkin. Ammo bu boshqa kun uchun muhokama!

Men har qanday fikr-mulohazalarni eshitishni yaxshi ko'raman yoki biror narsa o'tkazib yuborilgan bo'lsa. Quyida izoh qoldiring!