new Function sintaksisi
Funksiya yaratishning yana bir, kamdan-kam uchraydigan usuli bor โ new Function. U funksiyani satr (string) ko'rinishidagi koddan yaratishga imkon beradi. Bu maxsus vaziyatlarda juda foydali.
Sintaksis
Umumiy shakli quyidagicha:
let func = new Function([arg1, arg2, ...argN], funcBody);
Funksiya arg1...argN argumentlari (parametrlar nomlari) va so'nggi funcBody (funksiya tanasi โ kod satri) bilan yaratiladi. Barchasi satr ko'rinishida beriladi.
Argumentsiz funksiya ham yaratish mumkin โ bunda faqat tana beriladi:
Asosiy farqi: satrdan kod olish
Oddiy funksiyalar kod yozilish paytida (yozuvchi tomonidan) belgilanadi. new Function esa funksiyani ishlash vaqtida (runtime), istalgan satrdan yaratishga imkon beradi.
Bu shuni anglatadiki, funksiya kodini serverdan olib yoki dinamik ravishda shakllantirib, keyin uni bajariladigan funksiyaga aylantirish mumkin:
new Function('a, b', 'return a + b') โ bu ham to'g'ri ishlaydi.Closure va new Function
Bu yerda muhim va nozik jihat bor. Odatdagi funksiyalar o'zi yaratilgan joydagi tashqi o'zgaruvchanlarni "eslab qoladi" (closure). Ammo new Function orqali yaratilgan funksiya bunday emas โ uning [[Environment]] (leksik muhiti) global muhitga ishora qiladi, o'zi yaratilgan joyga emas.
Shuning uchun bunday funksiya tashqi lokal o'zgaruvchanlardan foydalana olmaydi โ faqat global va o'ziga uzatilgan argumentlarni ko'radi:
function getFunc() {
let qiymat = "test"; // lokal o'zgaruvchan
// Bu funksiya lokal 'qiymat'ni KO'RMAYDI:
let func = new Function('return qiymat');
return func;
}
// getFunc()(); // XATOLIK: qiymat is not defined
return function() { return qiymat; } yozganimizda, u lokal qiymatni ko'rgan bo'lardi. new Function esa faqat globalni ko'radi. Bu โ ataylab qilingan tarhli qaror.Nega shunday? Chunki agar new Function lokal o'zgaruvchanlarni ko'ra olganida, minifikatsiya (kodni siqib, o'zgaruvchan nomlarini a, b kabi qisqartirish) paytida satr ichidagi nomlar mos kelmay, kod buzilar edi. Global muhit bilan cheklash bu xavfni yo'q qiladi.
Qachon ishlatiladi?
new Function juda kam hollarda kerak bo'ladi, lekin ba'zi vaziyatlarda bebaho:
- Serverdan kod satri sifatida olingan mantiqni bajariladigan funksiyaga aylantirish;
- Shablon (template) dvigatellari โ foydalanuvchi kiritgan ifodalarni funksiyaga o'girish;
- Dinamik hisob-kitob โ matematik ifodalarni matndan olib bajarish.
new Functionga deyarli murojaat qilinmaydi. U maxsus vosita โ faqat koddan dinamik funksiya yasash zarur bo'lganda tanlanadi.new Functionga (yoki evalga) uzatish โ xavfli. Bu zararli kod bajarilishiga olib kelishi mumkin. Faqat ishonchli manbadagi kod bilan ishlang.Xulosa
new Function(args, body)โ funksiyani satrdan yaratadi;- Argumentlar va tana โ barchasi satr ko'rinishida beriladi;
- Yaratilgan funksiya global muhitga bog'lanadi, lokal o'zgaruvchanlarni ko'rmaydi;
- Bu minifikatsiya bilan mos ishlash uchun qilingan;
- Asosan koddan dinamik funksiya yasash kerak bo'lganda ishlatiladi โ ishonchsiz satrga ehtiyot bo'ling.