Curried JavaScript - 调用

时间:2018-04-04 20:13:23

标签: javascript functional-programming

我无疑是JavaScript的初学者,但我需要将其他人的代码拼凑在一起,我无法理解以下函数以及如何在节点中调用它。

const invoke = method => object => object[method]

这显然是一个函数,它接受一个返回另一个函数的方法,该函数接受一个然后返回object [method]的对象,但究竟是什么目的呢?如何使用它?谢谢。

2 个答案:

答案 0 :(得分:2)

我看到的方式是const状态,invokes存储在object中的函数, 正如你所提到的,这可以分解为:

const invoke = (method) => {    
    return (object) => {    
      return object[method] ;
    }
}

我相信的目标是你可以用invoke来自a的函数functions来称呼它(就像你讲故事) {1}}对象。 (functionnal-programming

来自article about functional programming

  

函数式编程是声明性的而不是命令性的,并且   应用程序状态流经纯函数。与对象对比   面向编程,其中应用程序状态通常是共享的   与对象中的方法共存。

但是术语invoke让我想到Immediately invoked functions,因此const invoke的用法可以是:

从对象获取函数(不执行它)不必实例化整个对象并将函数放在变量中并且可能操纵它prototype

调用函数(带括号)。

从对象获取属性。

立即调用对象中的函数。

const myFns = {
  'a' : function(x){
    console.log(x || 'something to log when no params passed');
  },
  'b': {
    username : 'Doe'
  } 
}

const invoke = method => object => object[method]

let myFunction = invoke('a')(myFns); 
myFunction('hello from myFunction'); // call it or modify myFunction.prototype ... etc.

invoke('a')(myFns)('hello'); // simply call it 

let user = invoke('b')(myFns); // get a property
console.log(user.username);

(invoke('a')(myFns))(); // immidiatly invoke the function

probalby 以避免eval():P

答案 1 :(得分:0)

名称'调用'建议它应该真的写成这样:

const invoke = method => object => object[method]()

()是调用。它很通用,很难确切地说它将如何使用,但这是一个愚蠢的例子。

class Dog {
    speak () { console.log('woof') }
}

var dogs = [ new Dog(), new Dog(), new Dog() ];

dogs.forEach( invoke( 'speak' ) );

-> 'woof'
-> 'woof'
-> 'woof'

forEach之类的数组方法像这样对高阶函数进行第二次调用是一种非常常见的模式。