2015-10-09 9 views
60

Interesuje mnie, czy istnieją ograniczenia co do tego, jakie typy wartości można ustawić za pomocą const w JavaScript-w poszczególnych funkcjach. Czy to jest ważne? To prawda, że ​​działa, ale czy jest to zła przyczyna?Właściwe użycie const do definiowania funkcji w JavaScript

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

Czy wszystkie funkcje należy zdefiniować w ten sposób w ES6? Wygląda na to, że tak się nie stało, jeśli tak.

Dzięki za wszelkie komentarze!

+0

Wydaje się zapytać wielokrotność pytania: 1) * "Interesuje mnie, czy istnieją ograniczenia co do tego, jakie typy wartości można ustawić za pomocą const w JavaScript" * Nr 2) * "Czy jest to ważne?" * Tak, 3) * "czy jest uważane za złe? Praktykuj z jakiegokolwiek powodu "* Myślę, że nie było go wystarczająco długo, by cokolwiek o tym powiedzieć, ale nie rozumiem, dlaczego powinno to być praktyka padowa.Nie jest ono bardzo różne od' var doSomething = ; ' 4) * "Czy wszystkie funkcje powinny być zdefiniowane w ten sposób w ES6 ? "* Wydaje się nieporęczny dla mnie. Lubię deklaracje funkcji. Wszyscy są ich własnymi. –

+1

Sposób, w jaki to widzę (opinia, a nie fakt), ma sens, jeśli chcesz uniemożliwić przedefiniowanie funkcji. Czy to rozsądne, czy też ma jakieś funkcjonalne zastosowanie - to jest dyskusyjne. Jeśli uważasz, że pasuje do twojego scenariusza użycia, nie sądzę, że ktoś może argumentować twoją decyzję i uzna to za złą praktykę. – Mjh

+2

Myślę, że pytanie brzmi, co chcesz osiągnąć za pomocą 'const'. Czy chcesz zapobiec przejęciu funkcji? Zakładam, że znasz swój kod, by tego nie robić. Czy chcesz wyrazić zamiar 'doSomething', tzn. Czy posiada on funkcję i nie zmienia jej wartości? Myślę, że deklaracje funkcji również jasno to wyrażają. Tak więc, jeśli potrzebujesz "ochrony podczas pracy" przed przesłonięciem, idź do niego. W przeciwnym razie nie widzę zbyt wielu korzyści. Oczywiście jeśli używałeś przede wszystkim 'var foo = function() {};', użyłbym 'const' zamiast' var'. –

Odpowiedz

82

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

Zgłoszenie funkcji, to jest:

function doSomething() {} 

podnoszony jest w całości w górnej części zakresu (I jak let i const są bloku o zakresie również).

Oznacza to, że dalej będzie działać:

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

wyrażenie funkcyjne, czyli:

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

jest stworzenie funkcji anonimowej (function() {}) i utworzenia zmiennej, a następnie przypisanie tej anonimowej funkcji do tej zmiennej.

więc zwykłe reguły wokół zmiennej podnoszenia ramach zakresu - zmiennych blokowych scoped (let i const) nie podnosić jak undefined do góry ich zakresu bloku.

To znaczy:

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

Przechodzi od doSomething nie jest zdefiniowana. (Będzie rzucać ReferenceError)

Jeśli przełączyć się na używanie var dostajesz podnoszący zmiennej, ale będzie inicjowane undefined tak że blok kodu powyżej nadal nie działa. (Spowoduje to wyświetlenie TypeError, ponieważ doSomething nie jest funkcją w momencie jej wywoływania)

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

Axel Rauschmayer ma wielki post zakresu i podnoszenia tym ES6 semantyki: Variables and Scoping in ES6

+0

Chciałbym tylko dodać, że klasy es6 używają const wewnętrznie, aby chronić klasę przed ponownym przypisaniem w klasie. – user2342460

-1

To dość brzydkie, aby zrobić to w ten sposób, ale na pewno jest poprawne.

Tam, gdzie pracuję, zaprojektowałem prostą klasę fabryczną, która pobiera obiekt parent i szereg funkcji, a następnie udostępnia te funkcje rodzicowi poprzez moduły pobierające, używając defineProperty.

Ma ten sam efekt: funkcja nie może zostać zmieniona po zdefiniowaniu, ale moim zdaniem wygląda o wiele czystsza.

Najważniejsze to być konsekwentnym w swoim projekcie. Zbierz członków swojego zespołu i wyraźne uzgodnienia, w jaki sposób to zrobisz.

+1

Lekko nie na temat: Nie zdziwiłbym się, gdyby w przyszłości "const function name() {}" usprawniało JS z innymi językami. –

+4

"To brzydkie zrobić w ten sposób". Ta składnia faktycznie zyskuje całkiem sporo trakcji. Zobacz na przykład https://github.com/reactjs/redux/tree/master/examples/todos. – Izhaki

+0

Tak, teraz robię to w ten sposób, aby "przypiąć" zakres, domyślam się, że po prostu się do tego przyzwyczajam. –

-2

Stephan Bijzitter mówi
© To dość brzydka to zrobić w ten sposób

const foo = (a, _foo, b) => _foo(a, a, b) 
 
const bar = (a, b, c) => (c - 1) ? bar((a * b), b, (c - 1)) : a 
 

 
alert(
 
    foo(3, bar, 4) 
 
)

naprawdę?

34

Chociaż stosując const zdefiniować funkcje Wygląda hack, ale chodzi o niektórych wielkich zalet, które sprawiają, że lepsza (moim zdaniem)

  1. To sprawia funkcję niezmienne, więc nie musicie się martwić, że ta funkcja zostanie zmieniona przez jakiś inny fragment kodu.

  2. Możesz użyć składanki ze strzałką tłuszczu, która jest krótsza & czystsze.

  3. Korzystanie z funkcji strzałek wiąże się z obowiązkiem związanym z this.

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

sam przykład 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

+0

I możesz dwukrotnie zadeklarować dodanie funkcji (x, y), ale nie możesz zadeklarować dwa razy const add = ... – TatianaP

+0

1. Niezmienność jest prawdziwą korzyścią, ale bardzo rzadko zdarza się, aby ktoś nadpisał funkcję. 2. Składnia Fat arrow nie jest krótsza, chyba że twoja funkcja może być wyrażeniem. 'funkcja f (x, y) {' ma 18 znaków, 'const f = (x, y) => {' ma 21 znaków, więc o 3 znaki dłużej. 3. Zachowanie tego powiązania ma znaczenie tylko wtedy, gdy funkcje są zdefiniowane wewnątrz metody (lub innej funkcji, która ma znaczenie). W skrypcie najwyższego poziomu nie ma sensu. Nie mówię, że się mylisz, tylko że powody, o których wspomniałeś, nie są zbyt istotne. – Nakedible

0

Istnieje inny scenariusz, w którym stała funkcja może być przydatna. Jeśli masz dużo stałych w kodzie i potrzebują funkcji, które specyficznie działa na tych stałych, może to być dobry pomysł, aby włączyć tę funkcję w stałym sobie:

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. 
    } 
}; 

To nie niezbędne w jakikolwiek sposób aby zdefiniować FLAG_NAME jako stałą, ale poprawi to czytelność kodu, aby to zrobić.

3

Jest kilka bardzo ważnych korzyści dla używania const, a niektórzy twierdzą, że powinny być używane wszędzie tam, gdzie jest to możliwe, ze względu na ich celowość i orientację.

Jest to, o ile mogę powiedzieć, najbardziej indykatywna i przewidywalna deklaracja zmiennych w Javascript i jedna z najbardziej użytecznych, PONIEWAŻ jak bardzo jest ograniczona. Czemu? Ponieważ eliminuje pewne możliwości dostępne dla var i zezwalania na deklaracje.

Co można wywnioskować, czytając "const"? Znasz wszystkie poniższe po prostu czytając deklarację deklaracji const ORAZ bez skanowania dla innych odniesień do tej zmiennej: wartość jest przypisana do tej zmiennej (chociaż jej obiekt bazowy nie jest głęboko niezmienny); dostęp do niego nie jest możliwy poza jego bezpośrednim blokiem; i wiązanie nigdy nie jest dostępne przed deklaracją, ze względu na Temporal Dead Zone rules (TDZ).

Z artykułu twierdząc korzyści Pozwolić i const, a także bardziej bezpośrednio odpowiedzi na pytanie o ograniczeniami/limitów słowa kluczowego:

„Ograniczenia takie jak te oferowane przez niech i const są skutecznym sposobem dokonywania Kod jest łatwiejszy do zrozumienia, staraj się gromadzić jak najwięcej z tych ograniczeń w kodzie, który piszesz. Im bardziej deklaratywne ograniczenia ograniczają to, co może oznaczać kawałek kodu, tym łatwiej i szybciej ludzie czytają, przetwarzają i rozumieją kawałek kodu w przyszłości

Zgoda na więcej deklaracji const niż deklaracji var: zakres blokowy, TDZ, przypisanie przy deklaracji, brak ponownego zadanie. Natomiast instrukcje var tylko sygnalizują zakres funkcji. Zliczanie reguł nie daje jednak wiele wglądu. Lepiej jest 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 blokowania oznacza węższy zakres niż funkcja scoping, TDZ oznacza, że ​​nie musimy skanować zakresu wstecz od deklaracji, aby wykryć użycie przed deklaracją, a reguły przypisania oznaczają, że powiązanie zawsze będzie zachowywać to samo odniesienie.

Im bardziej ograniczone są instrukcje, tym prostszy staje się kawałek kodu. Gdy dodamy ograniczenia do tego, co może oznaczać wypowiedź, kod staje się mniej nieprzewidywalny. Jest to jeden z największych powodów, dla których programy napisane statycznie są na ogół łatwiejsze do odczytania niż te napisane dynamicznie. Pisanie statyczne nakłada duże ograniczenia na program piszący, ale także nakłada duże ograniczenia na interpretację programu, dzięki czemu jego kod jest łatwiejszy do zrozumienia.

Z tych argumentów na uwadze, zaleca się używać const gdzie jest to możliwe, ponieważ jest to stwierdzenie, że daje nam najmniejsze możliwości, aby myśleć o „

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