Когда дело доходит до функционального программирования, даже эксперты в таких языках, как Java, становятся новичками. Для людей, которые плохо знакомы с кодированием, функции — это еще более странная вещь.

Функции рассматриваются как основные типы данных в JavaScript. Но их может быть трудно использовать таким образом, учитывая, что они могут содержать сотни строк кода, другие функции, которые могут содержать даже больше функций, и такие функции могут быть возвращены и передается как параметры. Обычно это используется, чтобы придать JavaScript объектно-ориентированный вид.

И самая запутанная часть заключается в том, что единственное, что отделяет переменную от функции, — это пара круглых скобок.

Например, возьмем эту функцию:

function something() {
  return "Hi there, just a string passing by!";
}

something технически может быть двумя вещами

console.log(typeof something);  // "function"
console.log(typeof something());  // "string"

Теперь большинство людей смогут сказать, когда идет речь о самой функции или о ее возвращаемом значении (результате ее вызова). Но новые кодеры могут быть не уверены.

На самом деле вы можете думать о () как о чем-то в JavaScript, который пытается вызывать все, что вы помещаете перед ним. Если эта штука оказывается функцией, она идет вперед и успешно выполняет свой код. Но некоторые функции написаны для выполнения другихфункций, и если вы выполняете функцию, а затем затем передаете ее в качестве параметра, что-то пойдет не так.

Вот ошибка некоторых новичков:

var myFunction = function() {
  console.log("Ding!");
}
setTimeout(myFunction(), 1000);

Давайте сначала разберемся с работой setTimeout(). Он принимает функцию в качестве параметра и после задержки выполняет ее. Можно сказать, что он берет первый параметр и ставит перед ним (). В примере происходит следующее: вы выполняете функцию, а затем затем передаете ее в качестве параметра.

В общем, так оно и есть myFunction()()

Правильный код должен быть: setTimeout(myFunction, 1000);

Но вы заметите, что это не выдает ошибку. Кроме того, console.log("Ding!") действительно выполняется, но не с задержкой в ​​тысячу миллисекунд. Это потому, что функция выполняется первой, чтобы получить возвращаемое значение (в данном случае — никакого). И так, толпа дураков устремляется на StackOverflow (я там тоже был).

Но не думайте, что каждый раз, когда вы видите подобный код в такой функции, это неправильно. Что, если у нас есть такая функция -

function one() {
  console.log("I return another function!");
  return function() {
    console.log("Hi, I'm the second function!");
  }
}
setTimeout( one() , 1000);

В этом случае функция one выполняется для получения возвращаемого значения. При этом выполняется первый console.log (не с задержкой). setTimeout() получает возвращаемое значение, а затем ждет 1 секунду перед его выполнением. Таким образом, второй console.log() выполняется с задержкой.

По сути, в этом случае one()() работает. На самом деле это допустимый синтаксис. Так что это тоже сработает -

function what() {
  return function() {
    return function() {
      return function() {
        console.log("wtf is happening");
      }
    }
  }
}
what()()()()();  //works

Однако не делайте этого, если вы работаете с другими.