Անվանված ֆունկցիոնալ արտահայտությունները JavaScript-ում

Ենթադրենք՝ ունենք հետևյալ ֆունկցիոնալ արտահայտությունը՝

javascriptlet test = function() {
  console.log('!');
};

test(); // կարտածի '!'

Տանք մեր ֆունկցիային func անունը՝

javascriptlet test = function func() {
  console.log('!');
};

test();

Ինչպես արդեն գիտեք, այդ անունով ֆունկցիային դուրսից հասանելի չէ՝

javascriptlet test = function func() {
  console.log('!');
};

test(); // կարտածի '!'
func(); // կտա սխալ

Ինչու՞ է անհրաժեշտ տալ ֆունկցիային անուն, եթե այն հասանելի չի լինի։ Բանը նրանում է, որ այդ անունը ֆունկցիայի ներսում կլինի հասանելի, թեև դրսից՝ ոչ։

Ստուգենք՝

javascriptlet test = function func() {
  console.log(func); // ֆունկցիան կարտածի իր սկզբնական կոդը
};

test(); // կանչում ենք ֆունկցիան

Կանչենք մեր ֆունկցիան նրա ներսից՝

javascriptlet test = function func() {
  console.log('!'); // արտածում ենք '!'
  func(); // կանչում ենք ինքն իրեն
};

test();

Եթե գործարկել այս կոդը, ապա կոնսոլ կարտածվի անվերջ քանակությամբ տողեր։

Իրականում, մեր ֆունկցիան կարող է իր ներսից կանչվել ոչ միայն որպես func, այլև որպես test՝

javascriptlet test = function func() {
  console.log('!');
  test(); // կանչում ենք ինքն իրեն
};

test();

Ո՞րն է տարբերությունը։ Տարբերությունն այն է, որ test անունը պարզապես փոփոխական է։ Սկրիպտի աշխատանքի ընթացքում մեր ֆունկցիան կարող է գրվել մեկ այլ փոփոխականի մեջ կամ փոխանցվել որպես պարամետր՝ այս դեպքում test փոփոխականի և ֆունկցիայի միջև կապը կարող է խզվել։

func անունը, however, կոշտ կերպով կապված է ֆունկցիայի հետ հենց այն նպատակով, որ կարողանանք դիմել մեր ֆունկցիային նրա ներսից։

Ֆունկցիայի անունով այսպիսի Function Expression-ները կոչվում են անվանված ֆունկցիոնալ արտահայտություններ։