Javascript -hoisting

Odpowiedz Nowy wątek
2019-05-29 01:13
0

Dlaczego poniższy kod jest poprawny:

const before=()=>{
        console.log(after())
}
const after= props=>{
    return 4;
}

before()

A poniższy wywala błąd?

console.log(z);
const z = 4;

Pozostało 580 znaków

2019-05-29 01:34
2

bo w 1 wszystko jest dostepne, a w 2 "z" nie istnieje gdy o nią wołasz.

no tyle to wiem. w pierwszym przypadku funkcja wywoływana jest niżej wywołująca. - bartek164 2019-05-29 01:35
@bartek164: no to skoro wiesz to po co się pytasz? - mr_jaro 2019-05-29 01:41
ehhh. no bo oczywiście chodzi o to dlaczego nie działą. - bartek164 2019-05-29 01:43
@bartek164 ale przecież ci wyjaśniłem dlaczego nie działa, czego nie rozumiesz w stwierdzeniu "z nie istnieje" - mr_jaro 2019-05-29 01:47
dlaczego funkcja afer jest dostępna z poziomu funkcji before, skoro jest zadelarowana póżniej - bartek164 2019-05-29 01:48
@bartek164 miejsce deklaracji nie ma znaczenia może być nawet w innym pliku, ważne jest by była dostępna przy wywołaniu. - mr_jaro 2019-05-29 01:50

Pozostało 580 znaków

2019-05-29 01:54

W drugim przypadku usiłujesz odwołać się do zmiennej, której wartości jeszcze nie zdefiniowałeś.

W pierwszym przypadku tworzysz po prostu i uruchamiasz dwie funkcje:

function before() {
  console.log(after());
}

function after(props) {
  return 4;
}

before();

I odwołujesz się do nich już po ich zadeklarowaniu, ale JS najpierw wczytuje funkcje, a później dopiero wykonuje goły kod, więc poniższe też zadziała:


before();

function before() {
  console.log(after());
}

function after(props) {
  return 4;
}

Chyba, że zechcesz zadeklarować funkcje jak zmienne:

before();

var before = function() {
 console.log(after());
}

var after = function(props) {
  return 4;
}

To wtedy musisz się do nich odwoływać, po kolei, jak do zmiennych.


Swoją drogą to ten parametr props nie był tam nigdzie użyty, ale zachowuję, jak w oryginale. - Freja Draco 2019-05-29 01:56

Pozostało 580 znaków

2019-05-29 02:00
0

Aha dobra lol. Jak popatrzyłem na 3 przypadek to zauważyłem że before() jest na samym końcu i to od niego zaczyna się wywołanie. Dużo różnych przypadków robiłem i jakoś mi się tak bardzo pomieszało że nie zauważyłem. Sorki panowie programisty. ;0--0

Pozostało 580 znaków

2019-05-29 02:04
3
bartek164 napisał(a):

Sorki panowie programisty. ;0--0

*ogląda się za siebie (przez oba ramiona jednocześnie)*


edytowany 1x, ostatnio: Freja Draco, 2019-05-29 02:04
Pokaż pozostałe 4 komentarze
Nie rozumiem, bo jednocześnie. - Silv 2019-05-29 17:06
@Silv: no to jednocześnie to akurat nie tak dosłownie, tylko w ramach multitaskingu z podziałem czasu zegara ;) - Freja Draco 2019-05-29 17:08
<szuka mokrej chustki na czoło> - Silv 2019-05-29 17:09
@Silv: raczej jedwabnego szalika na szyję, żeby uniknąć otarć od tego przełączania procesów ;) - Freja Draco 2019-05-29 17:16
@Freja Draco: jak może szyja otrzeć się o samą siebie... no dobra, znając NaN w JS, to może, no ale... - Silv 2019-05-29 17:20

Pozostało 580 znaków

2019-05-29 02:13
4

Jak już jesteśmy w temacie, to mam inną zagwozdkę, ogarnij ten kod :)

function abc() {
  console.log(x);
  console.log(x);
}

function def() {
  console.log(y);
  var y = 2;
  console.log(y);
}

x = 1;
abc();

y = 1;
def();

edytowany 1x, ostatnio: Freja Draco, 2019-05-29 02:17
a no to wiem. Się ogładało understanding the weird part. Choć ciężko w to uwierzyć ale czasem nie widzę oczywistych rzeczy. - bartek164 2019-05-29 16:26
Znając JS to wydaje się prawie logiczne. - Silv 2019-05-29 17:12
PS. @bartek164, osobiście nie nazywałbym tego oczywistym. - Silv 2019-05-29 17:22
@Freja Draco: dzięki Tobie przypomniałem sobie, co to są closures. - Silv 2019-05-29 17:23

Pozostało 580 znaków

2019-05-29 12:07
1
Freja Draco napisał(a):

Jak już jesteśmy w temacie, to mam inną zagwozdkę, ogarnij ten kod :)

function abc() {
  console.log(x);
  console.log(x);
}

function def() {
  console.log(y);
  var y = 2;
  console.log(y);
}

x = 1;
abc();

y = 1;
def();

Jeśli gdziekolwiek w funkcji(nawet na końcu) zainicjujesz zmienną lokalną o tej samej nazwie co globalna to cała funkcja odnosi się do lokalnej, ciekawe rozwiązanie..

edytowany 2x, ostatnio: JustCuzICan, 2019-05-29 12:08
Pokaż pozostałe 5 komentarzy
Zawsze można stosować type script tak jak ja to robie od jakiegoś czasu. - mr_jaro 2019-05-29 13:14
TypeScript to tylko nakładka, nie usuwa WTFów z języka (typeof null === 'object' choćby), czy dziwacznej składni (przez którą x => {a: b} nie zadziała, bo kiedyś ktoś dodał etykiety (do goto i break), więc trzeba umieścić to w nawiasie (x => ({a: b})), i mnóstwo takich małych pierdółek, które są wkurzające niczym klimat w Polsce. - LukeJL 2019-05-29 13:25
@LukeJL: może troche brutalne porównanie ale taki c++ jest tylko nakładką na kod maszynowy :p - mr_jaro 2019-05-29 13:28
prędzej na C. - LukeJL 2019-05-29 13:38
@LukeJL: ja bym raczej szedł w stronę: mogą być zarówno etykiety, jak i literały obiektowe, ale niech mają całkiem różną składnię. - Silv 2019-05-29 16:30

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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