Właściwe użycie const do definiowania funkcji w JavaScript

Interesuje mnie, Czy istnieją jakieś ograniczenia, jakie typy wartości można ustawić za pomocą const w JavaScript-w poszczególnych funkcjach. Czy to ważne? Przyznaję, że to działa, ale czy z jakiegoś powodu uważa się to za złą praktykę?

const doSomething = () => {
   ...
}

Czy wszystkie funkcje powinny być zdefiniowane w ten sposób w ES6? Nie wydaje się, aby to się udało, jeśli tak.

Dzięki za wszelkie komentarze!

Author: David Sinclair, 2015-10-09

5 answers

Nie ma problemu z tym, co zrobiłeś, ale musisz pamiętać różnicę między deklaracjami funkcji a wyrażeniami funkcji.

Deklaracja funkcji, czyli:

function doSomething () {}

Jest podniesiony całkowicie do góry zakresu (i podobnie jak let i const są również zakresami blokowymi).

Oznacza to, że będą działać:

doSomething() // works!
function doSomething() {}

Wyrażenie funkcji, czyli:

[const | let | var] = function () {} (or () =>

Jest utworzenie funkcji anonimowej (function () {}) i utworzenie zmiennej, a następnie przypisanie tej funkcji anonimowej do tej zmiennej.

Tak więc zwykłe zasady dotyczące podnoszenia zmiennych w zakresie -- zmiennych o zasięgu blokowym (let i const) nie podnoszą się jako undefined do góry ich zakresu blokowego.

Oznacza to:

if (true) {
    doSomething() // will fail
    const doSomething = function () {}
}

Nie powiedzie się, ponieważ {[10] } nie jest zdefiniowana. (Rzuci ReferenceError)

Jeśli przełączysz się na using var otrzymujesz wyciąganie zmiennej, ale zostanie ona zainicjowana na undefined więc powyższy blok kodu nadal nie będzie działał. (To rzuci TypeError ponieważ doSomething nie jest funkcją w momencie, gdy ją wywołujesz)

Jeśli chodzi o standardowe praktyki, należy zawsze używać odpowiedniego narzędzia do pracy.

Axel Rauschmayer ma świetny post na temat zakresu i podnoszenia, w tym semantyki es6: zmienne i zakresy w ES6
 120
Author: tkone,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-09 14:36:45

Chociaż używanie const do definiowania funkcji wydaje się hack, ale ma kilka wielkich zalet, które czynią go lepszym (moim zdaniem)

  1. Sprawia, że funkcja jest niezmienna, więc nie musisz się martwić, że ta funkcja zostanie zmieniona przez inny fragment kodu.

  2. Możesz użyć składni strzałek fat, która jest krótsza i czystsza.

  3. Korzystanie z funkcji strzałek zajmuje się this wiązaniem dla Ciebie.

Przykład z function

// define a function
function add(x, y) { return x + y; }

// use it
console.log(add(1, 2)); // 3

// oops, someone mutated your function
add = function (x, y) { return x - y; };

// now this is not what you expected
console.log(add(1, 2)); // -1

Ten sam przykład z const

// define a function (wow! that is 8 chars shorter)
const add = (x, y) => x + y;

// use it
console.log(add(1, 2)); // 3

// someone tries to mutate the function
add = (x, y) => x - y; // Uncaught TypeError: Assignment to constant variable.
// the intruder fails and your function remains unchanged
 49
Author: Gaafar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-12 12:10:58

Istnieje kilka bardzo ważnych korzyści z używania {[0] } i niektórzy powiedzieliby, że powinien być stosowany tam, gdzie to możliwe, ze względu na to, jak celowe i orientacyjne jest.

Jest to, o ile mogę powiedzieć, najbardziej orientacyjna i przewidywalna deklaracja zmiennych w JavaScript i jedna z najbardziej użytecznych, ze względu na to, jak bardzo jest ograniczona. Dlaczego? Ponieważ eliminuje pewne możliwości dostępne dla var i let deklaracji.

Co można wywnioskować czytając const? Ty zapoznaj się z poniższymi informacjami, czytając deklarację const i bez skanowania w poszukiwaniu innych odniesień do tej zmiennej:

  • wartość jest związana z tą zmienną (chociaż jej podstawowy obiekt nie jest głęboko niezmienny)
  • Nie można uzyskać dostępu poza jego blokiem zawierającym bezpośrednio]}
  • Wiązanie nie jest dostępne przed deklaracją, z powodu reguł Temporal Dead Zone (TDZ).

Poniższy cytat pochodzi z an artykuł argumentujący korzyści z let i const. To również bardziej bezpośrednio odpowiada na pytanie dotyczące ograniczeń/ograniczeń słowa kluczowego:

Ograniczenia takie jak te oferowane przez let i const są potężnym sposobem na ułatwienie zrozumienia kodu. Postaraj się zgromadzić jak najwięcej z tych ograniczeń w pisanym kodzie. Im bardziej deklaratywne ograniczenia, które ograniczają znaczenie fragmentu kodu, tym łatwiej i szybciej jest ludziom czytać, analizować i rozumieć kawałek kodu w przyszłości.

Przyznane, jest więcej reguł do const deklaracji niż do var deklaracji: block-scoped, TDZ, assign at declaration, no reignsign. Podczas gdy var polecenia sygnalizują tylko zakres funkcji. Liczenie reguł nie daje jednak zbyt wiele wglądu. Lepiej zważyć te reguły pod względem złożoności: czy reguła dodaje lub odejmuje złożoność? W przypadku const, zakres blokowy oznacza zakres węższy niż zakres funkcji, TDZ oznacza, że nie trzeba skanować zakresu wstecz od deklaracji w celu wykrycia użycia przed deklaracją, a reguły przypisywania oznaczają, że powiązanie zawsze zachowa to samo odniesienie.

Im bardziej ograniczone są instrukcje, tym prostszy staje się fragment kodu. Gdy dodamy ograniczenia do tego, co może oznaczać oświadczenie, kod staje się mniej nieprzewidywalny. Jest to jeden z największych powodów, dla których programy pisane statycznie są na ogół łatwiejsze do odczytania niż programy pisane dynamicznie. Static pisanie nakłada Duże ograniczenia na twórcę programu, ale również nakłada Duże ograniczenia na to, jak program może być interpretowany, dzięki czemu jego kod jest łatwiejszy do zrozumienia.

Mając na uwadze te argumenty, zaleca się użycie const tam, gdzie to możliwe, ponieważ jest to stwierdzenie, które daje nam najmniej możliwości myślenia.

Źródło: https://ponyfoo.com/articles/var-let-const

 6
Author: mrmaclean89,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-04 21:27:06

Minęły trzy lata, odkąd zadano to pytanie, ale właśnie na nie natrafiłem. Ponieważ ta odpowiedź jest tak daleko w dół stosu, proszę pozwolić mi ją powtórzyć:

P: jestem zainteresowany, Czy istnieją jakieś ograniczenia, jakie rodzaje wartości mogą być set using const in JavaScript - in particular functions. Czy to ważne? Oczywiście, że działa, ale [[7]}czy jest uważana za złą praktykę dla każdego powód?

Byłem zmotywowany do zrobienia pewnych badań po obserwując jednego płodnego kodera JavaScript, który zawsze używa const dla functions, nawet jeśli nie ma wyraźnego powodu / korzyści.

W odpowiedzi na "czy z jakiegoś powodu uważa się to za złą praktykę?" pozwól mi powiedzieć, IMO, tak jest, a przynajmniej są zalety używania function Oświadczenia.

Wydaje mi się, że jest to w dużej mierze kwestia preferencji i stylu. Jest kilka dobrych argumentów przedstawionych powyżej, ale żaden nie jest tak jasny jak w tym artykuł:

ciągłe zamieszanie: dlaczego nadal używam instrukcji funkcji JavaScript przez medium.freecodecamp.org/Bill Sourour, Guru JavaScript, konsultant i nauczyciel.

Zachęcam wszystkich do przeczytania tego artykułu, nawet jeśli już podjąłeś decyzję.

Oto główne punkty:

Wyrażenia funkcji mają dwie wyraźne zalety w stosunku do funkcji [const] wyrażenia:

Zaleta # 1: jasność intent

podczas skanowania przez tysiące linii kodu dziennie, warto wiedzieć, że intencje programisty tak szybko i łatwo, jak to możliwe.

Zaleta # 2: kolejność deklaracji = = kolejność wykonania

Idealnie, chcę zadeklarować mój kod mniej więcej w kolejności, w jakiej spodziewaj się, że zostanie stracony.

To jest dla mnie showstopper: każda wartość zadeklarowana za pomocą const słowo kluczowe jest niedostępne do czasu wykonania to.

To co opisałem powyżej zmusza nas do napisania kodu, który wygląda do góry nogami. Musimy zacząć od najniższego poziomu funkcji i pracy nasza droga na górę.

Mój mózg tak nie działa. Chcę kontekst przed szczegółami. Większość kodu jest pisana przez ludzi. Więc to ma sens, że większość ludzi kolejność rozumienia z grubsza jest zgodna z kolejnością wykonania większości kodu.
 3
Author: JMichaelTX,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-26 01:29:12

Jest inny scenariusz, w którym funkcja stała może być użyteczna. Jeśli masz wiele stałych w kodzie i potrzebujesz funkcji, która konkretnie działa na tych stałych, dobrym pomysłem może być przekształcenie tej funkcji w stałą:

const FLAG_ONE   = 1;
const FLAG_TWO   = 2;
const FLAG_THREE = 4;
// etc.

// resolves flag into string for debugging purposes:
const FLAG_NAME = flag => {
    switch ( flag ) {
        case FLAG_ONE: return 'one';
        // etc.
    }
};

Nie jest konieczne w żaden sposób definiowanie nazwy flagowej jako stałej, ale poprawi to czytelność Twojego kodu.

 0
Author: Peter Coester,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-07 07:50:03