Je veux rendre cette syntaxe possible:
var a = add(2)(3); //5
basé sur ce que j'ai lu à http://dmitry.baranovskiy.com/post/31797647
Je ne sais pas comment rendre cela possible.
Add doit être une fonction qui prend un argument et retourne une fonction qui prend un argument qui ajoute l'argument à ajouter et lui-même.
var add = function(x) {
return function(y) { return x + y; };
}
function add(x) {
return function(y) {
return x + y;
};
}
Ah, la beauté de JavaScript
Cette syntaxe est très soignée aussi
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
}
}
Fonctions de première classe et fermetures font le travail.
essayez ceci vous aidera de deux manières: ajoutez (2) (3) et ajoutez (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
}
Fonctionne pour tout et n'a pas besoin de final () à la fin de la fonction, contrairement à d'autres solutions.
console.log(add(1)(2)(3)(10)); // 16
console.log(add(10)(10)); // 20
La syntaxe ES6 rend cela simple et agréable:
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
C'est à propos de JS et un peu strict avec 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
Cela fonctionne comme un charme avec une chaîne d'addition illimitée !!
en plus de ce qui a déjà été dit, voici une solution générique de currying (basée sur http://github.com/sstephenson/prototype/blob/master/src/lang/function.js#L180 )
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))
Ceci est une solution généralisée qui résoudra add (2,3) (), add (2) (3) () ou toute combinaison analogue à add (2,1,3) (1) (1) (1) (2,3) ( 4) (4,1,1) (). Veuillez noter que peu de contrôles de sécurité ne sont pas effectués et que cela peut être optimisé davantage.
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)();
Le concept de FERMETURE peut être utilisé dans ce cas.
La fonction "add" renvoie une autre fonction. La fonction en cours de retour peut accéder à la variable dans la portée du parent (dans ce cas, la variable a).
function add(a){
return function(b){
console.log(a + b);
}
}
add(2)(3);
Voici un lien pour comprendre les fermetures http://www.w3schools.com/js/js_function_closures.asp
Cela va gérer à la fois
add(2,3) // 5
ou
add(2)(3) // 5
Ceci est un exemple de curry ES6 ...
const add = (a, b) => (b || b === 0) ? a + b : (b) => a + b;
function add(a, b){
return a && b ? a+b : function(c){return a+c;}
}
console.log(add(2, 3));
console.log(add(2)(3));
Avec ES6, répartissez l'opérateur ...
et la fonction .reduce
. Avec cette variante, vous obtiendrez la syntaxe d'enchaînement mais le dernier appel ()
est requis ici car la fonction est toujours renvoyée:
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 A(a){
return function B(b){
return a+b;
}
}
J'ai trouvé une bonne explication pour ce type de méthode. Il est connu sous le nom de Syntax of Closures
veuillez vous référer à ce lien Syntaxe des fermetures
Nous pouvons simplement écrire une fonction comme celle-ci
function sum(x){
return function(y){
return function(z){
return x+y+z;
}
}
}
sum(2)(3)(4)//Output->9
fonction 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
Les fonctions de flèche facilitent sans aucun doute l'obtention du résultat souhaité:
const Sum = a => b => b ? Sum( a + b ) : a;
console.log(Sum(3)(4)(2)(5)()); //19
console.log(Sum(3)(4)(1)()); //8
const add = a => b => b ? add(a+b) : a;
console.log(add(1)(2)(3)());
Ou (`${a} ${b}`)
pour les chaînes.