Wywołanie funkcji.

0

Hej, powiedzcie mi jaka jest różnica w wywołaniu funkcji za nawiasami po funkcji i bez nawiasów. Co może powodować w odniesienu do wywoływania jakichś metod np. setInterval itp.
Liczę na obszerne wyjaśnienie :) szukałem w internecie i stwierdziłem że może ktoś z was lepiej mi to wytłumaczy.

1

próbuję zrozumieć w ogóle o co Ci chodzi?
podaj jakiś konkretny przykład?

0

Strzelam, że chodzi o zapis

funkcja()

lub

funkcja 

W pierwszym wypadku wywołujesz funkcję od razu w drugim przypisujesz np do jakiejś zmiennej "wskazanie" na wybraną funkcję. O to ci chodzi?

0

1.

function showText() {
  console.log('pokaz mnie');
}

setTimeout(showText, 1000);

Do setTimeout przekazujesz jako argument funkcję "showText", która zostanie uruchomiona po 1000 ms.

2.

function buildShowTextFunc(text, error) {
  console.log('buildShowTextFunc run')

  if (error) {
     return function () {  console.error(text);  }
  }

return function () {   console.log(text);   }
}

// 1:
setTimeout(buildShowTextFunc, 1000);  // po 1000 ms pokaze sie 'buildShowTextFunc run''

// 2:
var showLog = buildShowTextFunc('logi...', false);
setTimeout(showLog, 2000);
// to samo:
setTimeout(buildShowTextFunc('logi...', false), 2000);  //  od razu pokaze sie 'buildShowTextFunc run', a po 2000 ms pokaze sie tekst z funkcji która została zwrócona 

3: 
setTimeout(buildShowTextFunc('bledy...', true), 3000);  //  j.w. tylko do setTimeout zostanie przekazana druga funkcja, ta z console.error
1

Po pierwsze Twoje stwierdzenie na temat wywoływania funkcji jest błędne. Funkcję wywołujemy przez użycie nawiasów, funkcja bez nawiasów, to nie jest wywołanie funkcji.

Ale od początku...

W programowaniu masz coś takiego jak zmienne. Zmienne trzymają jakieś wartości.

const foo = 1;

Mamy też funkcje. Funkcje mogą przyjmować parametry:

function logFoo(foo) {
  console.log(foo);
}

Mogą też zwracać różne rzeczy:

function addFive(foo) {
  return foo + 5;
}

W JavaScript funkcje są również czymś, co się nazywa first-class citizen:

In programming language design, a first-class citizen (also type, object, entity, or value) in a given programming language is an entity which supports all the operations generally available to.

Oznacza to, że możemy je przekazywać tak samo jak zmienne. Możemy je nawet zwracać! Czyli taki zapis jest prawidłowy:

const foo = 5;

function logFoo(foo) {
  console.log(foo);
}

function addFive(foo, doSomething) {
  doSomething(foo); // 2. dopiero w tym miejscu następuje wywołanie naszej funkcji, którą przekazaliśmy w pkt. 1
  return foo + 5;
}

addFive(foo, logFoo); // 1. w tym miejscu logFoo nie oznacza wywołania funkcji, przekazujemy tylko referencję do tej funkcji

Jeżeli dodamy nawiasy w ostatniej linii, to wtedy funkcja logFoo zostanie najpierw wywołana, a do funkcji addFive zostanie przekazana wartość zwrócona przez tą funkcję, a nie jej referencja.

const foo = 5;

function logFoo(foo) {
  console.log(foo);
}

function addFive(foo, doSomething) {
  doSomething(foo); // 2. dopiero w tym miejscu następuje wywołanie naszej funkcji, ale tym razem dostaniemy błąd Undefined is not a function, ponieważ przekazaliśmy wartość wywołania, a nie referencję
  return foo + 5;
}

addFive(foo, logFoo()); // 1. w tym miejscu wywołanie logFoo zwróci undefined (funkcja nie zwraca nic)

W przypadku setTimeout oraz setInterval ma miejsce sytuacja przedstawiona w pierwszym przypadku. Funkcje te można w dużym uproszczeniu przedstawić tak:

function setTimeout(functionToCallAfterTimeout, timeoutInMilliseconds) {
  // Jezeli minęło timeoutInMilliseconds?
  //     wywołumemy functionToCallAfterTimeout()
  // nie minęło
  //     czekay
}

Więcej do poczytania https://appendto.com/2016/10/[...]tions-as-first-class-objects/

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