Interesuje mnie, czy istnieją ograniczenia co do tego, jakie typy wartości można ustawić za pomocą const
JavaScript - w poszczególnych funkcjach. Czy to jest ważne? To prawda, że działa, ale czy z jakiegoś powodu jest uważane za złą praktykę?
const doSomething = () => {
...
}
Czy wszystkie funkcje powinny być zdefiniowane w ten sposób w ES6? Wydaje się, że tak się nie stało.
Dziękuję za wszelkie komentarze!
javascript
function
const
ecmascript-6
David Sinclair
źródło
źródło
var doSomething = <function def>;
. 4) „Czy wszystkie funkcje powinny być zdefiniowane w ten sposób w ES6?” Wydaje mi się kłopotliwy. Lubię deklaracje funkcji. Każdy ma swoje.const
. Czy chcesz uchronić się przed zastąpieniem funkcji? Zakładam, że znasz swój kod, aby tego nie robić. Czy chcesz wyrazić zamiardoSomething
, tzn. Że pełni on funkcję i nie zmienia swojej wartości? Wydaje mi się, że deklaracje funkcji również jasno wyrażają ten zamiar. Jeśli więc potrzebujesz „ochrony środowiska wykonawczego” przed zastąpieniem, skorzystaj z niej. W przeciwnym razie nie widzę większych korzyści. Oczywiście, jeśli głównie używałeśvar foo = function() {};
, użyłbymconst
zamiastvar
.const
.Odpowiedzi:
Nie ma problemu z tym, co zrobiłeś, ale musisz pamiętać różnicę między deklaracjami funkcji i wyrażeniami funkcji.
Deklaracja funkcji, to znaczy:
Jest w całości podnoszony na szczyt zakresu (i tym podobne,
let
iconst
mają również zakres blokowy).Oznacza to, że następujące funkcje będą działać:
Wyrażenie funkcyjne, to znaczy:
Jest utworzeniem anonimowej funkcji (
function () {}
) i utworzeniem zmiennej, a następnie przypisaniem tej anonimowej funkcji do tej zmiennej.Zatem zwykłe reguły dotyczące podnoszenia zmiennych w zakresie - zmienne o zasięgu blokowym (
let
iconst
) nie podnoszą coundefined
do początku zakresu bloków.To znaczy:
Błąd, ponieważ
doSomething
nie jest zdefiniowany. (Rzuci aReferenceError
)Jeśli przełączysz się na używanie
var
, otrzymasz podnoszenie zmiennej, ale zostanie ona zainicjowana, abyundefined
powyższy blok kodu nadal nie działał. (Wyrzuci to,TypeError
żedoSomething
nie jest funkcją w momencie jej wywołania)Jeśli chodzi o standardowe praktyki, zawsze powinieneś używać odpowiedniego narzędzia do pracy.
Axel Rauschmayer ma świetny post na temat zakresu i podnoszenia, w tym semantyki es6: Zmienne i określanie zakresu w ES6
źródło
function a(){console.log(this);}
i bconst a=_=>{console.log(this);}
polega na tym, że nazwijmy to taka.call(someVar);
, jak w a , wydrukujesomeVar
, w b , wydrukujewindow
.Chociaż używanie
const
do definiowania funkcji wydaje się być włamaniem, ale ma kilka wspaniałych zalet, które czynią go lepszym (moim zdaniem)Sprawia, że funkcja jest niezmienna, więc nie musisz się martwić, że funkcja ta zostanie zmieniona przez inny fragment kodu.
Możesz użyć składni Fat Arrow, która jest krótsza i czystsza.
Używanie funkcji strzałek dba o
this
wiązanie dla Ciebie.przykład z
function
ten sam przykład z
const
źródło
function f(x, y) {
ma 18 znaków,const f = (x, y) => {
ma 21 znaków, więc 3 znaki dłuższe. 3. Zachowanie tego wiązania ma znaczenie tylko wtedy, gdy funkcje są zdefiniowane w metodzie (lub innej funkcji, która ma to znaczenie). Na najwyższym poziomie skrypt jest bezcelowy. Nie twierdzę, że się mylisz, tylko dlatego, że wymienione przez ciebie przyczyny nie są zbyt istotne.Minęły trzy lata, odkąd zadano to pytanie, ale dopiero teraz się z nim spotykam. Ponieważ ta odpowiedź jest tak daleko w dół, pozwól mi ją powtórzyć:
Byłem zmotywowany do przeprowadzenia pewnych badań po zaobserwowaniu jednego płodnego kodera JavaScript, który zawsze używa
const
instrukcjifunctions
, nawet jeśli nie ma wyraźnego powodu / korzyści.W odpowiedzi na pytanie „ czy to jest uważane za złą praktykę z jakiegokolwiek powodu? ”, Pozwól mi powiedzieć, IMO, tak, to jest, a przynajmniej istnieją zalety korzystania ze
function
stwierdzenia.Wydaje mi się, że jest to w dużej mierze kwestia preferencji i stylu. Istnieje kilka dobrych argumentów przedstawionych powyżej, ale żaden nie jest tak jasny, jak w tym artykule:
Ciągłe zamieszanie: dlaczego wciąż używam instrukcji funkcji JavaScript medium.freecodecamp.org/Bill Sourour, guru JavaScript, konsultant i nauczyciel.
Wzywam wszystkich do przeczytania tego artykułu, nawet jeśli już podjęliście decyzję.
Oto główne punkty:
źródło
defaultErrorHandler
przypisane własne const jako funkcję anonimową, którą mogę następnie wywołać z programów obsługi obietnic. Umożliwiłoby mi to opcjonalne „zastąpienie” tej domyślnej procedury obsługi błędów w funkcjach, tak jak potrzebowałem. Niektórzy po prostu zwracają obiekt błędu, a inni zwracają odpowiedź HTTP o różnym poziomie szczegółowości. Jednak struktura kodu może być znanym wzorcem niezależnie..then( res.success, res.error )
znacznie więcej niż anonimowe funkcje, które zamierzałem po prostu wywołaćres.success(value);
. Posiadanie.then( ..., defaultErrorHandler)
wspólnego wzorca może być przyjemne, ze zdefiniowaną na najwyższym poziomie funkcją defaultErrorHandler i opcjonalnie miećconst defaultErrorHandler = error => { ... }
zadeklarowany zakres funkcji zgodnie z potrzebami.Istnieje kilka bardzo ważnych korzyści z używania,
const
a niektórzy twierdzą, że należy go używać wszędzie tam, gdzie to możliwe, ze względu na to, jak celowe i indykatywne jest.Jest to, o ile mogę powiedzieć, najbardziej indykatywna i przewidywalna deklaracja zmiennych w JavaScript oraz jedna z najbardziej przydatnych PONIEWAŻ, jak bardzo jest ograniczona. Czemu? Ponieważ eliminuje niektóre dostępne możliwości
var
ilet
deklaracje.Co możesz wywnioskować, czytając
const
? Znasz wszystkie poniższe elementy, czytającconst
deklarację ORAZ bez skanowania innych odniesień do tej zmiennej:Poniższy cytat pochodzi z artykułu uzasadniającego zalety
let
iconst
. Bardziej bezpośrednio odpowiada na pytanie dotyczące ograniczeń / ograniczeń słowa kluczowego:Źródło: https://ponyfoo.com/articles/var-let-const
źródło