@boga-net

Как разобраться в функциях и не запутаться?

Всем привет. Помогите понять функции. Я совсем запутался с return, с замыканиями, с function expression и function declaration. Весь день пробую вернуть значение из функции, перебирая разные варианты. Вроде бы знаю, как надо, в видео и гугле есть примеры, но когда подстраиваю под свои нужды - уже не работает. Я просто не до конца понимаю принципы работы функций и return.

вот есть функция и её вызов. Почему вот так не работает ?

$('#button').on('click', test);

function test() {

  var sum = 10;
  
  var res = function() {
    console.log(sum);
  }
  return res;
};

test();


А вот так работает

function test() {

  var sum = 10;
  
  var res = function() {
    console.log(sum);
  }
  return res;
};

var newTest = test();

$('#button').on('click', newTest);


Я просто добавил функцию test() в переменную newTest и теперь событие click вызывает newTest

И вот так работает :

function test() {

  var sum = 10;
  
  var res = function() {
    console.log(sum);
  }
  return res;
};

var newTest = test();

$('#button').on('click', test());


Теперь при клике я вызываю test() со скобками (в отличие от newTest - без скобок - в предыдущем примере), но она не срабатывает сразу, а только после клика. Хотя, вроде бы, если я указываю test() на обработчик, то должна сразу вызываться..

Вот так не работает :

var test = function() {

  var sum = 10;
  
  var res = function() {
    console.log(sum);
  }
  return res;
};

$('#button').on('click', test);


Если вызвать её через : console.log(test()); то вернётся описание функции res() (или переменной со ссылкой на эту функцию);

А если вызвать console.log(test); - без скобок, то вернётся описание функции test(). Хорошо, здесь что-то более менее понятно, что результатом работы функции test() является функция res(). Если просто вызвать test без скобок - вернётся описание test. Если со скобками - функция выполнится, а её результатом является описание функции res(). Но куда делся console.log(sum) ?

Вот ещё пример. Здесь я не указываю скобки и всё работает. И работает click с вызовом функции test().

function test() {

  var sum = 10;
  console.log(sum);

};

$('#button').on('click', test);


Или вот так :

function test() {

  var sum = 10;
  console.log(sum);

};

var newTest = test;
$('#button').on('click', newTest);


Получается не важно, буду я вызывать при клике test или newTest ?
Правильно понимаю, что лучше использовать второй вариант ?

Вроде гипотетически понятно, как возвращается, но когда пытаешься результат функции присвоить переменной, чтобы потом эту переменную использовать для сложения суммы с другими переменными - ничего не получается.
Заранее спасибо за ответы
  • Вопрос задан
  • 168 просмотров
Решения вопроса 1
pavelkarinin
@pavelkarinin
Full Stack Web Developer
Вы должны четко различать понятие функция и указатель на функцию.
Если очень по-простому, то когда вы пишите так:
test();
то вы выполняете данную функцию

а если так:
var newTest = test;
то вы указываете на функцию как на объект, передавая функцию как объект (а не результат ее работы) в переменную newTest
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы