Когда дело доходит до функционального программирования, даже эксперты в таких языках, как 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
Однако не делайте этого, если вы работаете с другими.