Funkcja zwykła a strzałkowa

0

Czym się różnią się funkcje

// Deklaracja
function regular () {
    console.log('cos');
}
// Wywołanie
regular();

a

// Deklaracja
function regular () {
    console.log('cos');
}
// Wywołanie
regular();

a

// Deklaracja
let arrow = () =>{
    console.log('cos');
};
// Wywołanie
arrow();

czemu jest nacisk na używanie funkcji strzałkowych? Są one najgorzej czytelne. Również funkcja nr 2 jest niepotrzebnie rozbudowana, czy ma to jakieś zalety?

0

Zawsze używałem tej ostatniej, bo https://medium.com/front-end-weekly/do-i-still-need-to-bind-react-functions-in-2019-6d0fe72f40d7 Jakoś nie chciało mi się wnikać w zamysły projektowe js-a (zbyt często doszukiwałem się sensu, którego nie było...).

0
CodeRZ napisał(a):

czemu jest nacisk na używanie funkcji strzałkowych? Są one najgorzej czytelne. Również funkcja nr 2 jest niepotrzebnie rozbudowana, czy ma to jakieś zalety?

Pozwolę sobie się z Tobą niezgodzić. Czytelność jest totalnie odwrotna niż piszesz. To trzecia wersja jest najbardziej czytelna

3

1 i 2 są takie same.
3 - arrow function różni się od function zapisem i kontekstem this (więcej o tym możesz poczytać w sieci, mnóstwo osób już to rozkminiało i nie ma potrzeby robić tego jeszcze raz w tym wątku).

1

Funkcje strzałkowe nie są do końca równoważne zwykłym. Należy o tym pamiętać. https://levelup.gitconnected.com/arrow-function-vs-regular-function-in-javascript-b6337fb87032

6
Markuz napisał(a):

1 i 2 są takie same.

Jakbym miał zgadywać co poeta miał na myśli to bym strzelał że druga wersja miała wyglądać tak:

// Deklaracja
let regular = function () {
    console.log('cos');
}
// Wywołanie
regular();
7

Pozwolę sobie się z Tobą niezgodzić. Czytelność jest totalnie odwrotna niż piszesz. To trzecia wersja jest najbardziej czytelna

@KamilAdam - Nie, nie masz racji. Pierwsza opcja jest najbardziej czytelna i zgodna z większością języków - masz słowo deklarujące funkcję, potem jej nazwę, parametry i właściwe ciało funkcji. Osoba, która nie zna języka, ale ma jakieś pojęcie o programowaniu i tak od razu załapie, co to jest. Za to zapis numer 3 nie jest taki ewidentnie oczywisty, można pomyśleć, że to chodzi o coś związanego z obiektami, może się wydawać czymś związanym z Arrow operator -> in C/C++ itp. Na pewno nie jest to klasyczna deklaracja funkcji. Dla osób znających język jest to w miarę jasne i czytelne, ale i tak uważam, że pierwsza opcja jest najbardziej zgodna z klasyką i przez to najczytelniejsza.

4
cerrato napisał(a):

Pozwolę sobie się z Tobą niezgodzić. Czytelność jest totalnie odwrotna niż piszesz. To trzecia wersja jest najbardziej czytelna

@KamilAdam - Nie, nie masz racji. Pierwsza opcja jest najbardziej czytelna i zgodna z większością języków - masz słowo deklarujące funkcję, potem jej nazwę, parametry i właściwe ciało funkcji.

Składnia przykładowych lambd znalezionych w internecie:

  • Rust: let closure_annotated = |i: i32| -> i32 { i + 1 };
  • Scala: val ex = (x:Int) => x + x
  • Kotlin: val sum: (Int, Int) -> Int = { x: Int, y: Int -> x + y }
  • Ruby: times_two = ->(x) { x * 2 }

Widocznie znam niereprezentatywną grupę języków programowania :P

Dla porównania Haskell jest do niczego niepodobny:

  • funkcja : add x y = x + y
  • lambda: add = \x y -> x + y
1
KamilAdam napisał(a):

Składnia przykładowych lambd znalezionych w internecie:
Dla porównania Haskell jest do niczego niepodobny:

JS i tak jest nie do podrobienia chodzącym jak kot własnymi drogami this, którego próbują zapędzić do odpowiedniej zagrody przez apply, call, bind, arrow function

2

Są tak samo czytelne, różnią się tylko działaniem. Funkcje strzałkowe pod this mają to samo, co było pod tą wartością w bloku, w którym zostały zadeklarowane. Normalne mają to, co akurat zostało zbindowane, domyślne window, co w 99% przypadków jest zupełnie nieprzydatne.

Do tego funkcje strzałkowe są przypisywane w runtime, więc taki kod zadziała:

a();
function a() {}

A tu będzie błąd, że funkcja nie istnieje:

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

Kwestia preferencji i innych zaburzeń. Ja używam obu, co akurat bardziej pasuje.

0

O ile dobrze pamiętam, w strzałkowej nie masz obiektu(tablicy?pamięć zawodzi) arguments, który czasami można wykorzystać np. do szybkiego sprawdzenia ilości przekazanych argumentów dla sprawdzenia poprawności wywołania.
O kontekście napisali przedpiszący.

2
tsz napisał(a):

Są tak samo czytelne, różnią się tylko działaniem. Funkcje strzałkowe pod this mają to samo, co było pod tą wartością w bloku, w którym zostały zadeklarowane. Normalne mają to, co akurat zostało zbindowane, domyślne window, co w 99% przypadków jest zupełnie nieprzydatne.

Do tego funkcje strzałkowe są przypisywane w runtime, więc taki kod zadziała:

a();
function a() {}

A tu będzie błąd, że funkcja nie istnieje:

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

Kwestia preferencji i innych zaburzeń. Ja używam obu, co akurat bardziej pasuje.

Tutaj akurat nie ma znaczenia czy to funkcja strzałkowa czy "normalna".

a();
const a = function() { ... }

Też wywali ReferenceError.
Tutaj po prostu przypisujemy anonimową funkcję do zmiennej. A zmienna przed jej przypisaniem jest albo w temporal dead zone (dla let i const), albo undefined (dla var). I wywala błąd.

1 użytkowników online, w tym zalogowanych: 0, gości: 1