Անվանված ֆունկցիոնալ արտահայտությունները JavaScript-ում
Ենթադրենք՝ ունենք հետևյալ ֆունկցիոնալ արտահայտությունը՝
let test = function() {
console.log('!');
};
test(); // կարտածի '!'
Տանք մեր ֆունկցիային func անունը՝
let test = function func() {
console.log('!');
};
test();
Ինչպես արդեն գիտեք, այդ անունով ֆունկցիային դուրսից հասանելի չէ՝
let test = function func() {
console.log('!');
};
test(); // կարտածի '!'
func(); // կտա սխալ
Ինչու՞ է անհրաժեշտ տալ ֆունկցիային անուն, եթե այն հասանելի չի լինի։ Բանը նրանում է, որ այդ անունը ֆունկցիայի ներսում կլինի հասանելի, թեև դրսից՝ ոչ։
Ստուգենք՝
let test = function func() {
console.log(func); // ֆունկցիան կարտածի իր սկզբնական կոդը
};
test(); // կանչում ենք ֆունկցիան
Կանչենք մեր ֆունկցիան նրա ներսից՝
let test = function func() {
console.log('!'); // արտածում ենք '!'
func(); // կանչում ենք ինքն իրեն
};
test();
Եթե գործարկել այս կոդը, ապա կոնսոլ կարտածվի անվերջ քանակությամբ տողեր։
Իրականում, մեր ֆունկցիան կարող է իր ներսից
կանչվել ոչ միայն որպես func, այլև
որպես test՝
let test = function func() {
console.log('!');
test(); // կանչում ենք ինքն իրեն
};
test();
Ո՞րն է տարբերությունը։ Տարբերությունն այն է, որ
test անունը պարզապես փոփոխական է։ Սկրիպտի
աշխատանքի ընթացքում մեր ֆունկցիան կարող է գրվել
մեկ այլ փոփոխականի մեջ կամ փոխանցվել որպես
պարամետր՝ այս դեպքում test փոփոխականի և
ֆունկցիայի միջև կապը կարող է խզվել։
func անունը, however, կոշտ կերպով
կապված է ֆունկցիայի հետ հենց այն նպատակով,
որ կարողանանք դիմել մեր ֆունկցիային նրա ներսից։
Ֆունկցիայի անունով այսպիսի Function Expression-ները կոչվում են անվանված ֆունկցիոնալ արտահայտություններ։