我怎样才能让 var a = add(2)(3); //5 工作?

IT技术 javascript currying
2021-03-11 06:49:58

我想让这个语法成为可能:

var a = add(2)(3); //5

基于我在http://dmitry.baranovskiy.com/post/31797647上阅读的内容

我不知道如何使它成为可能。

6个回答

您需要将 add 作为一个函数,该函数接受一个参数并返回一个函数,该函数接受一个将参数添加到 add 和它本身的参数。

var add = function(x) {
    return function(y) { return x + y; };
}
你能告诉我吗,我们有这种语法的具体名称吗,我昨晚从面试官那里得到了同样的问题
2021-04-16 06:49:58
@mkHun 我展示的语法定义了一个匿名函数并将其分配给名为add. 第二个定义了一个名为 name 的命名函数add他们都工作。
2021-04-27 06:49:58
@tvanfosson 我认为我的以下解决方案更令人兴奋,无限添加链
2021-04-29 06:49:58
@tvanfosson 我是 JS 新手。我有一个疑问。为什么它(var add = function()不应该是function add(){ }function add()也给出相同的结果。
2021-05-04 06:49:58
ES2015 箭头语法简化了这项工作: const add = x => y => x + y;
2021-05-08 06:49:58
function add(x) {
    return function(y) {
        return x + y;
    };
}

啊,JavaScript 之美

这个语法也很简洁

function add(x) {
    return function(y) {
        if (typeof y !== 'undefined') {
            x = x + y;
            return arguments.callee;
        } else {
            return x;
        }
    };
}
add(1)(2)(3)(); //6
add(1)(1)(1)(1)(1)(1)(); //6
你如何使它与一个参数以及柯里化一起工作,例如 add(1) === 1, and add(1)(2) === 3
2021-04-29 06:49:58
我们可以做些什么来消除最后一个空括号,比如使 add(1)(2)(3) = 6 和 add(1)(2)(3)(4) = 10?我被要求写一个这样的函数,然后被困住了。
2021-04-30 06:49:58
@dionadar 好吧,不完全是 (0) 将返回 x 的值,它不是一个函数,因此在使用 (0) 后您无法添加任何其他内容。
2021-05-04 06:49:58
请参阅我的答案以获取没有最终 () 的解决方案
2021-05-10 06:49:58
if (y)应该是if (typeof y === "undefined"),因为零是一个有效的参数。
2021-05-12 06:49:58
function add(x){
  return function(y){
    return x+y
  }
}

一流的函数闭包可以完成这项工作。

试试这会以两种方式帮助你 add(2)(3) 和 add(2,3)

1.)

 function add(a){ return function (b){return a+b;} }

    add(2)(3) // 5

2.)

function add(a,b){
        var ddd = function (b){return a+b;};
        if(typeof b =='undefined'){
            return ddd;
        }else{
            return ddd(b);
        }
    }

add(2)(3) // 5
add(2,3) // 5
function add(n) {
  sum = n;
  const proxy = new Proxy(function a () {}, {
    get (obj, key) {
      return () => sum;
    },
    apply (receiver, ...args) {
      sum += args[1][0];
      return proxy;
    },
  });
  return proxy
}

适用于所有情况,并且不需要像其他一些解决方案那样在函数末尾使用 final ()。

console.log(add(1)(2)(3)(10));    // 16
console.log(add(10)(10));         // 20
所以我在学习代理时主要参考了2ality.com/2014/12/es6-proxies.html,但它的简短版本是在 javascript 中你可以为几乎每个操作创建陷阱。幸运的是,应用函数的操作与确定值的操作不同。所以我捕获了一个函数的 apply 和 getter 来创建这个。你可能已经在你的 es6 类中使用 getter 和 setter ( developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/... ) 这样做了,这只是更明确一点
2021-04-17 06:49:58
代理是可以的,但我认为我下面的答案更容易和可读!
2021-04-23 06:49:58
哇,你能解释一下吗,我不知道发生了什么。
2021-05-03 06:49:58
@hien 我什至没有考虑过,这是一个非常酷的解决方案。
2021-05-09 06:49:58
@GaleelBhasha 不知道为什么 jsFiddle 不工作,但它在 repl.it ( repl.it/repls/DirectPolitePasswords ) 和我的本地节点 repl 中工作。
2021-05-15 06:49:58