Кога да се използва декларация за функция спрямо израз на функция

Технически серия жаргон

Вероятно вече знаете как да пишете функции и по двата начина. function doStuff() {}и () =>{} са символи, които въвеждаме през целия ден. Но как се различават и защо да използваме едното над другото?

Забележка: Примери са дадени в JavaScript. У нас М ileage М ай V мерното с други езици.

Първата разлика: име

Когато създавате функция с име , това е декларация за функция . Името може да бъде пропуснато във функционалните изрази , което прави тази функция „анонимна“.

Декларация за функция:

function doStuff() {};

Израз на функция:

const doStuff = function() {}

Често виждаме анонимни функции, използвани със синтаксис ES6 по следния начин:

const doStuff = () => {}

Повдигане

Повдигането се отнася до наличието на функции и променливи „в горната част“ на вашия код, за разлика от само след като са създадени. Обектите се инициализират по време на компилация и са достъпни навсякъде във вашия файл.

Декларациите за функции са издигнати, но изразите на функции не са.

Лесно е да се разбере с пример:

doStuff();
function doStuff() {};

Горното не води до грешка, но това би:

doStuff();
const doStuff = () => {};

Случаят за функционални изрази

Може да изглежда, че декларациите за функции, с техните мощни свойства на повдигане, ще ограничат функционалните изрази за полезност. Но изборът на едно пред друго изисква да се помисли кога и къде е необходима функцията . По принцип кой трябва да знае за това?

Изразяват се функционални изрази, за да се избегне замърсяването на глобалния обхват . Вместо вашата програма да е наясно с много различни функции, когато ги държите анонимни, те се използват и незабавно се забравят.

IIFE

Името - незабавно извикани функционални изрази - почти казва всичко тук. Когато функцията се създава едновременно с извикването, можете да използвате IIFE, който изглежда така:

(function() => {})()

или:

(() => {})()

За по-задълбочен поглед върху IIFE вижте тази изчерпателна статия.

Обратни обаждания

Функция, предадена на друга функция, често се нарича „обратно извикване“ в JavaScript. Ето пример:

function mapAction(item) { // do stuff to an item } array.map(mapAction)
array.map(mapAction)

Проблемът тук е, че mapActionще бъде достъпен за цялото ви приложение - няма нужда от това. Ако този обратен извикване е израз на функция, той няма да бъде достъпен извън функцията, която го използва:

array.map(item => { //do stuff to an item })

или

const mapAction = function(item) { // do stuff to an item } array.map(mapAction)
array.map(mapAction)

въпреки че mapActionще бъде достъпен за код под инициализацията му.

Обобщение

Накратко, използвайте декларации за функции, когато искате да създадете функция в глобалния обхват и да я направите достъпна в целия си код. Използвайте функционални изрази, за да ограничите мястото, където функцията е достъпна, да запазите световния обхват и да поддържате чист синтаксис.

Препратки

  • Декларация за функция, MDN документи.
  • Израз на функция, MDN документи.
  • Повдигане, речник на MDN.

Серията Tech Jargon

Има толкова много фрази, които се хвърлят по време на технически срещи и конференции, като се приеме, че всички вече не са съгласни с езика. Често не съм с жаргон. Обичайно е разработчиците да се учудват, че ми липсва част от знанието.

Истината е, че често просто не знам точната дума за това. Като хора, но особено разработчици, обичаме да отхвърляме онези, които не „говорят приказките“, така че тази поредица е за получаване на солидно разбиране на програмните концепции, които човек „трябва да знае“.

Това е втората статия от поредицата. Първият беше функциите от по-висок ред. Внимавайте за още, докато отивам на срещи и конференции и се преструвам, че знам за какво говорят моите колеги, но след това трябва да се прибера вкъщи и да го потърся в Google.