web-dev-qa-db-ja.com

var a = add(2)(3);にする方法// 5仕事?

この構文を可能にしたい:

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

私が読んだものに基づいて http://dmitry.baranovskiy.com/post/31797647

どうやってそれを可能にするのか見当もつかない。

38
rajakvk

引数を取り、追加する引数とそれ自体を追加する引数を受け取る関数を返す関数であるためには、addが必要です。

var add = function(x) {
    return function(y) { return x + y; };
}
86
tvanfosson
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
33
Oscar Kilhed
function add(x){
  return function(y){
    return x+y
  }
}

ファーストクラスの機能 および クロージャー は仕事をします。

15
NVI

これを試してくださいadd(2)(3)とadd(2,3)の2つの方法で役立ちます

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
10
vasudev
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
9
Ben Hernandez

JSのカリングとvalueOfに少し厳しい:

function add(n){
  var addNext = function(x) {
    return add(n + x);
  };

  addNext.valueOf = function() {
    return n;
  };

  return addNext;
}

console.log(add(1)(2)(3)==6);//true
console.log(add(1)(2)(3)(4)==10);//true

無制限の追加チェーンを備えたチャームのように動作します!!

7
hien

ES6構文は、これを素晴らしく簡単にします。

const add = (a, b) => a + b;

console.log(add(2, 5)); 
// output: 7

const add2 = a => b => a + b;

console.log(add2(2)(5));
// output: 7
6
satyrsynth

これは両方を処理します

add(2,3) // 5

または

add(2)(3) // 5

これはES6カレーの例です...

const add = (a, b) => (b || b === 0) ? a + b : (b) => a + b;

既に述べたことに加えて、一般的なカリー化によるソリューションがあります( http://github.com/sstephenson/prototype/blob/master/src/lang/function.js#L18 に基づく)

Function.prototype.curry = function() {
    if (!arguments.length) return this;
    var __method = this, args = [].slice.call(arguments, 0);
    return function() {
      return __method.apply(this, [].concat(
        [].slice.call(args, 0),
        [].slice.call(arguments, 0)));
   }
}


add = function(x) {
    return (function (x, y) { return x + y }).curry(x)
}

console.log(add(2)(3))
3
user187291

これは、add(2,3)()、add(2)(3)()、またはadd(2,1,3)(1)(1)(2,3)( 4)(4,1,1)()。セキュリティチェックはほとんど行われず、さらに最適化できることに注意してください。

function add() {
        var total = 0;

        function sum(){
                if( arguments.length ){
                        var arr = Array.prototype.slice.call(arguments).sort();
                        total = total + arrayAdder(arr);
                        return sum;
                }
                else{
                        return total;
                }
        }

        if(arguments.length) {
                var arr1 = Array.prototype.slice.call(arguments).sort();
                var mytotal = arrayAdder(arr1);
                return sum(mytotal);
        }else{
                return sum();
        }

        function arrayAdder(arr){
                var x = 0;
                for (var i = 0; i < arr.length; i++) {
                        x = x + arr[i];
                };
                return x;
        }
}
add(2,3)(1)(1)(1,2,3)();
2

この場合、CLOSURESの概念を使用できます。
関数「add」は別の関数を返します。返される関数は、親スコープ内の変数(この場合は変数a)にアクセスできます。

function add(a){

    return function(b){
        console.log(a + b);
    }

}


add(2)(3);

クロージャーを理解するためのリンクはこちら http://www.w3schools.com/js/js_function_closures.asp

2
Rahul Arora

ES6では、...演算子と.reduce関数が広がります。このバリアントを使用すると、チェーン構文を取得できますが、関数が常に返されるため、ここでは最後の呼び出し()が必要です。

function add(...args) {
    if (!args.length) return 0;
    const result = args.reduce((accumulator, value) => accumulator + value, 0);
    const sum = (...innerArgs) => {
        if (innerArgs.length === 0) return result;
        return add(...args, ...innerArgs);    
    };
    return sum;
}




// it's just for fiddle output
document.getElementById('output').innerHTML = `
<br><br>add() === 0: ${add() === 0 ? 'true' : 'false, res=' + add()}
<br><br>add(1)(2)() === 3: ${add(1)(2)() === 3 ? 'true' : 'false, res=' + add(1)(2)()}
<br><br>add(1,2)() === 3: ${add(1,2)() === 3 ? 'true' : 'false, res=' + add(1,2)()}
<br><br>add(1)(1,1)() === 3: ${add(1)(1,1)() === 3 ? 'true' : 'false, res=' + add(1)(1,1)()}
<br><br>add(2,3)(1)(1)(1,2,3)() === 13: ${add(2,3)(1)(1)(1,2,3)() === 13 ? 'true' : 'false, res=' + add(2,3)(1)(1)(1,2,3)()}
`;
<div id='output'></div>
2
Alendorff
function add(a, b){
 return a && b ? a+b : function(c){return a+c;}
}

console.log(add(2, 3));
console.log(add(2)(3));
1
manoj shukla

矢印関数を使用すると、必要な結果を簡単に取得できます。

const Sum = a => b => b ? Sum( a + b ) : a;

console.log(Sum(3)(4)(2)(5)()); //19

console.log(Sum(3)(4)(1)()); //8
1
Amir Danish
function A(a){
  return function B(b){
      return a+b;
  }
}

私はこのタイプの方法について素晴らしい説明を見つけました。 クロージャの構文

このリンクを参照してください Syntax of Closures

0
Nithin Mohan

単純にこのような関数を書くことができます

    function sum(x){
      return function(y){
        return function(z){
          return x+y+z;
        }
      }
    }

    sum(2)(3)(4)//Output->9
0
AshwiniB

ここでは、メイン関数iterの内部で呼び出されるすべての関数が参照し、udpate xであるクロージャーの概念を使用します。ループがどれだけ長くても、最後の関数までxにアクセスできます。

function iter(x){    
return function innfunc(y){
//if y is not undefined
if(y){
//closure over ancestor's x
x = y+x;
return innfunc;
}
else{
//closure over ancestor's x
return x;
    }
  }
}

iter(2)(3)(4)()// 9 iter(1)(3)(4)(5)()// 13

0
Ayyappa Gollu

function add(){var sum = 0;

    function add() {
        for (var i=0; i<arguments.length; i++) {
            sum += Number(arguments[i]);
        }
        return add;
    }
    add.valueOf = function valueOf(){
        return parseInt(sum);
    };
    return add.apply(null,arguments);
}

// ...

console.log(add() + 0);               // 0
console.log(add(1) + 0);/*                 // 1
console.log(add(1,2) + 0);               // 3
0
Vishesh Mishra

複雑にならないでください。

var add = (a)=>(b)=> b ? add(a+b) : a;
console.log(add(2)(3)()); // Output:5

最新のjavascript(ES6)で動作します。これは再帰関数です。

0
kailash N
const add = a => b => b ? add(a+b) : a;

console.log(add(1)(2)(3)());

または(`${a} ${b}`)は文字列です。

0
LBoyle