Как эта штука с функциями высшего порядка работает в Javascript

В книге Eloquent Javascript Марина Хавербеке есть этот пример введение понятия функций высшего порядка:

function greaterThan(n) {
  return function(m) { return m > n; };
}
var greaterThan10 = greaterThan(10);
console.log(greaterThan10(11));
// → true

Я не совсем уверен, как это работает... возможно, отвечая на мой собственный вопрос, но вот как я это вижу:

  • Сначала в этой строке вызывается greaterThan(n), присваивая свое значение переменной greaterThan10:

    var greaterThan10 = greaterThan(10);
    
  • Это делает функцию, хранящуюся как greaterThan10, похожей на:

    function greaterThan(10) {
      return function(m) { return m > 10; };
    }
    
  • Затем, когда вы вызываете greaterThan10(11), вы вызываете функцию выше, которая переводится как:

    function greaterThan(10) {
      return function(11) { return 11 > 10; };
    }
    

    Следовательно, возвращение True в качестве результата как 11 > 10 действительно верно.

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


person jimm-cl    schedule 02.07.2015    source источник
comment
Да... здесь n становится переменной замыкания   -  person Arun P Johny    schedule 02.07.2015


Ответы (2)


Вы правы, с точки зрения понимания, но оценивается это немного по-другому.

var greaterThan10 = greaterThan(10);

Эта строка не делает функцию, хранящуюся как greaterThan10, «выглядящей» как угодно — она создает новую функцию, передавая ей переменную n, так что greaterThan10 становится функцией, которая выглядит как

var greaterThan10 = function(m) { return m > 10; };

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

person Evan Knowles    schedule 02.07.2015

Я также запутался, читая пример, но позже пришел к выводу, как показано ниже:

В главе 3: функции было объяснено, как объявить функцию, используя обозначение стрелки (=>). Обозначение стрелки идет после списка параметров, и если есть только один параметр, скобки вокруг списка параметров могут быть опущены. Итак, m — это параметр, а не имя функции.

Итак, после первого вызова greaterThan(10), greaterThan10 по существу становится

var greaterThan10 = function (m) { return m > 10; }

После второго вызова, greaterThan10(11), становится

function (11) { return 11 > 10; }

11 > 10, что возвращает истину.

person kumarras    schedule 11.03.2018