7

может кто-нибудь объяснить мне, что происходит в следующем коде. Функция принимает n в качестве параметра, поэтому откуда находится m? Весь код запутан. Если кто-то может объяснить?Функции javascript более высокого порядка

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

ответ

7

Это функция функционального программирования, называемая currying. (относится также к partial function appliction)

Больше, чем > обычно принимает 2 аргумента (один слева и один справа). Это способ подачи по одному.

Это может быть легче увидеть, что происходит, если вы называете это рядным:

greaterThan(10)(11); 

Как видно из примера выше, 10 получает передается в качестве параметра n, а затем 11 получает прошло для параметра m.

Первое приложение, которое передает 10 выдает функцию, которая выглядит следующим образом:

function(m) { return m > 10; }; 

Это первый приложение в частичном применении.

Оттуда легко увидеть, как передается 11, чтобы получить окончательный результат.

Таким образом, чтобы разбить его:

function greaterThan(n) { 
    return function(m) { return m > n; }; 
} 

//var greaterThan10 = greaterThan(10); -- is equivalent to: 
var greaterThan10 = function(m) { return m > 10; }; 

console.log(greaterThan10(11)); //--> true 
+0

Спасибо теперь очень ясно .. – whatever

6

m является 11, передается в течение второго вызова.

При вызове greaterThan(10), она возвращает новую функцию, которая выглядит как:

function(m) { 
    return m > 10; 
} 

, который затем сохраняется в greaterThan10. Это называется currying.

1

У вас есть две функции там.

n происходит, когда вызывается первая функция.

m происходит, когда вызывается вторая функция (которая является возвращаемым значением первой функции).

greaterThan10 = greaterThan(10); 
//       ^^ n 
greaterThan10(11)) 
// ^^ returned function 
//   ^^ m 
+0

Спасибо !!!!!!! – whatever

2

greaterThan это функция, которая возвращает другую функцию, как результат, m является paraterer того, что возвращается функцией. Так что в вашем коде: var greaterThan10 = function(m) { return m > 10; };

и console.log(greaterThan10(11)); такое же, как console.log(11 > 10);

+1

Спасибо! это была настоящая помощь .. – whatever

2

при вызове функции greaterThan возвращает другую функцию, но не число поплавка. Внутренняя функция знает о n, потому что она внутри функции greaterThan.

Поскольку функция обертки возвращает другую функцию, которую можно назвать второй, как этого

var result = greaterThan(10)(11); 

первого аргумент 10 будет использоваться для функции обертки, но результата есть функция, так что вы можете передать аргументы для внутренней функции сразу. это возможно только если у вас есть return function(){...}

вы можете попробовать что-то вроде

var a = function (x){ 
     return function(y){ 
      return function(z){ 
       return x*y*z; 
      } 
      } 
     } 
var result = a(5)(3)(8); 
Смежные вопросы