3 votes

est-il possible de décharger une fonction JavaScript anonyme non-IIFE d'une propriété ?

Il m'est arrivé de trouver utile d'attribuer des propriétés aux fonctions avant de les transmettre comme arguments à d'autres fonctions.

Cela ressemblait à ceci (désolé pour toute confusion entre les fonctions anonymes et les objets de fonction assignés à une variable, je pense que ce n'est pas la même chose) :

"(could strict mode have something to do with this?)"

var funcOne = function(arg1, arg2) { return arg1 + arg2; };
funcOne.process = true;
var funcTwo = function(arg1, arg2) { return arg1 + arg2; };
funcTwo.process = false;

var procFunc = function(argFunc) {
    if (argFunc.process) { 
        return argFunc(1,2);
    }
    return "not processed"
}

procFunc(funcOne); // 3
procFunc(funcTwo); // "not processed"

Je voudrais déclarer une fonction anonyme et lui attribuer simultanément des propriétés de sorte que, lorsqu'elle est appelée ultérieurement dans le cadre d'une pile de tableaux de fonctions, le code conditionnel puisse dépendre de la propriété.

Quelque chose comme :

"(could strict mode have something to do with this?)"

var funcOne = function(arg1, arg2) { return arg1 + arg2; }.process = true;
var funcTwo = function(arg1, arg2) { return arg1 + arg2; }.process = false;

var procFunc = function(argFunc) {
    if (argFunc.process) { 
        return argFunc(1,2);
    }
    return "not processed"
}

procFunc(funcOne); // "not processed"
procFunc(funcTwo); // "not processed"

L'inattendu "not processed" est dû au fait que, de manière confuse, JavaScript assigne en fait les valeurs "true" et "false" aux variables funcOne et Two, et il n'envoie pas d'erreur lorsque la conditionnelle if (argFunc.process) est évaluée (indépendamment, comme je le suppose, du "mode strict").

J'ai réussi à faire fonctionner cette fonction de manière anonyme en utilisant un IIFE qui assigne la fonction 'anonyme' à une variable, puis assigne la propriété à cette variable et renvoie cette variable hors de l'IIFE, mais j'espérais qu'il existait une syntaxe JavaScript pour cela ou simplement une meilleure méthode, peut-être.

À mon sens, l'affectation de la propriété du point que j'ai essayé n'a pas de sens. Et si le programmeur voulait attribuer plusieurs propriétés à la fonction anonyme ?

J'ai eu un espoir de courte durée avec var funcOne = function (arg1, arg2) { return arg1 + arg2; } = { process: true }; mais cela jette un SyntaxError: Invalid left-hand side in assignment .

4voto

CertainPerformance Points 110949

Pour créer une fonction, vous avez deux possibilités :

  • Déclaration de fonction

Dans ce cas, aucune expression n'est utilisée :

function funcOne(...) {
}

Il n'y a aucun moyen d'ajouter quelque chose comme funcOne.process = true sauf en tant que déclaration séparée et autonome. (Non pas que ce soit une mauvaise chose - je préférerais en fait une telle deuxième déclaration, c'est probablement la plus facile à lire).

  • Expression de la fonction

Avec ceci, vous avez une expression de fonction que vous pouvez assigner à un nom de variable - mais vous ne pouvez pas assigner au nom de variable et assigner une propriété à la fonction en même temps avec = parce que = (l'opérateur d'affectation) se résout en l'opérateur valeur qui a été attribuée quel que soit le type de chose qui se trouve à gauche de l'écran. = . C'est pourquoi la méthode suivante ne fonctionne pas :

var funcOne = function x(arg1, arg2) { return arg1 + arg2; }.process = true;

Ci-dessus, la valeur qui a été attribuée est true donc la valeur que funcOne reçoit est true (aucune référence à la fonction ne subsiste).

Mais, vous pouvez utiliser Object.assign qui se résume au premièrement l'objet auquel il a été affecté, pour combiner la déclaration de la fonction et la propriété supplémentaire que vous souhaitez affecter à l'objet de la fonction en une seule déclaration essentiellement concise :

var funcOne = Object.assign(
  (arg1, arg2) => { return arg1 + arg2; },
  { process: true }
);
console.log(funcOne(3, 4));

0voto

altruios Points 712

La composition fonctionnelle est le bon tract... voici une fonction pour ajouter un accessoire à une autre fonction.

var addProp = function(fun, propName, propVal){fun[propName] = propVal; return fun}

var funcOne = addProp(function(arg1,arg2){ return arg1 + arg2; }, "process",true);
var funcTwo = addProp(function(arg1,arg2){ return arg1 + arg2; }, "process",false);

le code résultant ressemble à cela. et se comporte comme prévu

0voto

Kryten Points 8603

Une autre façon de procéder serait d'utiliser une fonction d'aide :

const addProp = (fn, value) => { fn.process = value; return fn; };

const myFunc = addProp((arg1, arg2) => arg1 + arg2, true);

console.log(myFunc.process); // => true
console.log(myFunc(1, 2));   // => 3

Vous pourriez probablement aussi le faire avec un décorateur, bien que ce soit une proposition pour les futures versions de l'ECMASCript et nécessiterait une transpilation pour fonctionner.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X