Нюансы функцыянальных выразаў у JavaScript

Назва Function Expression дана не проста так. Яно сапраўды азначае гэта - тое, што такія функцыі з'яўляюцца часткай якой-небудзь выраза.

Напрыклад, мы можам скласці які-небудзь радок і функцыю без назвы:

javascriptlet str = 'str' + function() {return 3;};
console.log(str); // выведе 'strfunction() {return 3;}'

Чаму мы бачым такі дзіўны вынік, а не лік 3? Таму што другое дадаемае - гэта не вынік працы функцыі, а яе зыходны код (бо мы гэтую функцыю не выклікалі, а проста напісалі).

Гэта значыць назва функцыянальны выраз абазначае тое, што такая функцыя прымае ўдзел у якім-небудзь выражы.

Прысвойванне зменнай таксама выраз:

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

Можна таксама, напрыклад, перадаць функцыю ў якасці параметра console.log і ён выведе яе зыходны код у кансоль - гэта таксама будзе лічыцца выразам:

javascriptconsole.log(function() {return 3;});

Чаму гэта важна: таму што адрозненне Function Declaration і Function Expression зусім не ў тым, што першая функцыя ствараецца з іменем, а другая першапачаткова імя не мае. Гэта не так.

Прыклад. Вось у нас функцыя без імя, але пры гэтым не прымае ўдзел ні ў якім выражы (гэта ёй не робіцца ніякіх дзеянняў, кажучы проста):

javascript/*
  Даная функцыя будзе Function Declaration,
  але з сінтаксічнай памылкай:
*/
function() {
  console.log('!');
}

Такі код наогул выдасць памылку! Чаму: так як функцыя не прымае ўдзел ні ў якім выражы, то браўзэр лічыць яе Function Declaration, але не знаходзіць яе імя і выдае памылку.

Каб памылка знікла, трэба прымусіць функцыю стаць часткай якой-небудзь выраза. Напрыклад, напішам перад ёй аперацыю +:

javascript+function() { // такі код карэктны
  console.log('!');
};

Як гэта працуе: сама па сабе аперацыя + нічога не робіць, гэта ўсё роўна як напісаць замест ліку 3 лік +3 - дапушчальна, але нічога не мяняе.

Але ў выпадку з функцыяй - мяняе. Цяпер нашая функцыя ўжо не проста напісана, а прымае ўдзел у выражы. Таму памылкі цяпер не будзе. Выніку выканання функцыі таксама не будзе, бо мы яе проста напісалі, але не выклікалі.

Замест + можна напісаць усё, што заўгодна. Напрыклад:

javascript-function() { // такі код карэктны
  console.log('!');
};

!function() { // такі код карэктны
  console.log('!');
};

Можна таксама ўзяць нашую функцыю ў круглыя дужкі, у гэтым выпадку яна таксама стане функцыянальным выразам:

javascript(function() { // такі код карэктны
  console.log('!');
});
Задание 1

Вызначыце, ці з'яўляецца прадстаўленая функцыя Function Declaration ці Function Expression:

javascriptfunction func() {
  console.log('!');
}
Задание 2

Вызначыце, ці з'яўляецца прадстаўленая функцыя Function Declaration ці Function Expression:

javascriptlet func = function() {
  console.log('!');
}
Задание 3

Вызначыце, ці з'яўляецца прадстаўленая функцыя Function Declaration ці Function Expression:

javascript+function() {
  console.log('!');
}
Задание 4

Вызначыце, ці з'яўляецца прадстаўленая функцыя Function Declaration ці Function Expression:

javascript!function func() {
  console.log('!');
}
Задание 5

Вызначыце, ці з'яўляецца прадстаўленая функцыя Function Declaration ці Function Expression:

javascript-function func() {
  console.log('!');
}
Задание 6

Вызначыце, ці з'яўляецца прадстаўленая функцыя Function Declaration ці Function Expression:

javascript1 + function func() {
  console.log('!');
}
Задание 7

Вызначыце, ці з'яўляецца прадстаўленая функцыя Function Declaration ці Function Expression:

javascript(function func() {
  console.log('!');
})
Задание 8

Вызначыце, ці з'яўляецца прадстаўленая функцыя Function Declaration ці Function Expression:

javascriptconsole.log(
  function() {
    console.log('!');
  }
);