この構文を可能にしたい:
var a = add(2)(3); //5
私が読んだものに基づいて http://dmitry.baranovskiy.com/post/31797647
どうやってそれを可能にするのか見当もつかない。
引数を取り、追加する引数とそれ自体を追加する引数を受け取る関数を返す関数であるためには、addが必要です。
var add = function(x) {
return function(y) { return x + y; };
}
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
function add(x){
return function(y){
return x+y
}
}
ファーストクラスの機能 および クロージャー は仕事をします。
これを試してください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
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
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
無制限の追加チェーンを備えたチャームのように動作します!!
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
これは両方を処理します
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))
これは、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)();
この場合、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
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>
function add(a, b){
return a && b ? a+b : function(c){return a+c;}
}
console.log(add(2, 3));
console.log(add(2)(3));
矢印関数を使用すると、必要な結果を簡単に取得できます。
const Sum = a => b => b ? Sum( a + b ) : a;
console.log(Sum(3)(4)(2)(5)()); //19
console.log(Sum(3)(4)(1)()); //8
function A(a){
return function B(b){
return a+b;
}
}
私はこのタイプの方法について素晴らしい説明を見つけました。 クロージャの構文
このリンクを参照してください Syntax of Closures
単純にこのような関数を書くことができます
function sum(x){
return function(y){
return function(z){
return x+y+z;
}
}
}
sum(2)(3)(4)//Output->9
ここでは、メイン関数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
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
複雑にならないでください。
var add = (a)=>(b)=> b ? add(a+b) : a;
console.log(add(2)(3)()); // Output:5
最新のjavascript(ES6)で動作します。これは再帰関数です。
const add = a => b => b ? add(a+b) : a;
console.log(add(1)(2)(3)());
または(`${a} ${b}`)
は文字列です。