retutn fun c () или return fun c without () from fun c (), что происходит с кодом? - PullRequest
1 голос
/ 07 мая 2020
function sum(a) {

  let currentSum = a;

  function f(b) {
    currentSum += b;
    return f;
   }

  f.toString = function() {
    return currentSum;
  };
  console.log(f);
  return f;
}

alert( sum(1)(2) ); // 3
alert( sum(5)(-1)(2) ); // 6

пожалуйста, помогите мне понять разницу между - return f и f (). что происходит с кодом функции при активации return f? как это работает? почему console.log (f) возвращает число? я знаю, что f () возвращает результат, но возвращает f? я не понимаю.

Ответы [ 4 ]

1 голос
/ 07 мая 2020

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

Возможно, более простой пример для демонстрации мог бы быть что-то вроде

function foo() {
    console.log("foo called");
}

bar = foo;  // Assign the function foo to the variable bar
            // Note that this doesn't actually call foo

bar();  // Now we call the foo function

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

0 голосов
/ 07 мая 2020

Каждый раз, когда вы вызываете функцию суммы, вы всегда возвращаете ссылку на функцию f. Итак, sum (1) вернет ссылку на f, а sum (1) .toString () вернет 1, sum (1) (2) вернет ссылку на f, а sum (1) (2) .toString () вернет 3

Это не рекурсия, потому что вы возвращаете только ссылку. Так что, пока вы не вызовете его, функция не будет вызвана

0 голосов
/ 07 мая 2020

Функция без () является указателем на функцию. Я все время использую его с setTimeout.

function doSomething() {
    console.log('something');
}

setTimeout(doSomething, 5000);
0 голосов
/ 07 мая 2020

Бывает так, что когда вы пытаетесь добавить в console.log любое значение, он вызывает метод toString.

В вашем экземпляре вы переопределяете метод toString вместо реализации по умолчанию, он возвращает число

...