J'ai une fonction qui a des arguments nommés.
J'essaie d'appeler la même fonction à partir de différents événements sans écraser les valeurs des autres précédemment attribuées.
J'ai essayé de stocker les valeurs des boutons précédemment cliqués dans des variables mais cela ne fonctionne pas.
Y a-t-il un moyen d'appeler les fonctions et d'attribuer un seul argument à la fois sans écraser les autres?
<button onclick="mainFun({val1 : 'Caller 1'})">First Event</button> <button onclick="mainFun({val2 : 'Caller 2'})">Second Event</button> <button onclick="mainFun({val3 : 'Caller 3'})">Third Event</button>
function mainFun({ val1, val2, val3 }) { var value1 = val1, value2 = val2, value3 = val3; // console.log(value1, value2, value3); console.log(val1, val2, val3); }
Essayer de réaliser:
Lors du premier événement> Appelant 1 non défini non défini
Lors du deuxième événement> Appelant 1 Appelant 2 non défini
Lors du troisième événement> Appelant 1 Appelant 2 Appelant 3
Merci d'avance!
3 Réponses :
Vous pouvez stocker les valeurs en tant que propriété de la fonction.
<button onclick="work({ val1: 'Caller 1' })">First Event</button> <button onclick="work({ val2: 'Caller 2' })">Second Event</button> <button onclick="work({ val3: 'Caller 3' })">Third Event</button>
function mainFun(defaults = {}) { return function({ val1 = defaults.val1, val2 = defaults.val2, val3 = defaults.val3 }) { defaults.val1 = val1; defaults.val2 = val2; defaults.val3 = val3; console.log(val1, val2, val3); }; } var work = mainFun();
Si vous n'aimez pas stocker les valeurs en tant que propriétés de la fonction, vous pouvez utiliser une fermeture et renvoyer une fonction pour le même groupe de cas d'utilisation.
<button onclick="mainFun({ val1: 'Caller 1' })">First Event</button> <button onclick="mainFun({ val2: 'Caller 2' })">Second Event</button> <button onclick="mainFun({ val3: 'Caller 3' })">Third Event</button>
function mainFun({ val1 = mainFun.val1, val2 = mainFun.val2, val3 = mainFun.val3 }) { mainFun.val1 = val1; mainFun.val2 = val2; mainFun.val3 = val3; console.log(val1, val2, val3); }
Pas ma question, juste par curiosité: comment / pourquoi ça marche? Chaque onclick ne crée-t-il pas une nouvelle instance de mainFunc? (modifier: cette question faisait référence à votre réponse avant la modification)
@Frank, non c'est toujours la même fonction. les valeurs sont stockées dans les propriétés de la fonction, car les sont des objets de première classe < / a>.
Exactement ce dont j'avais besoin, c'était d'éviter d'utiliser des variables à l'intérieur ou à l'extérieur de la portée de la fonction.
Les variables
value1
, value2
et value3
sont locales à votre fonction mainFun
. Ils sont récupérés après chaque exécution de mainFun
.
Pour réaliser ce que vous voulez réaliser, vous devrez stocker les paramètres précédents quelque part.
Il existe de nombreuses possibilités:
<button onclick="mainFun({val1 : 'Caller 1'})">First Event</button> <button onclick="mainFun({val2 : 'Caller 2'})">Second Event</button> <button onclick="mainFun({val3 : 'Caller 3'})">Third Event</button>
let value1, value2, value3; function mainFun({ val1, val2, val3 }) { value1 = val1 || value1; value2 = val2 || value2; value3 = val3 || value3; console.log(value1, value2, value3); //console.log(val1, val2, val3); }
Veuillez me corriger si je ne comprends pas bien votre question. Mais si vous souhaitez stocker les valeurs, vous devrez les déclarer en dehors de votre fonction. Actuellement, vos valeurs ne sont vivantes que dans votre fonction. Lorsque la fonction est appelée, elles seront recréées et une fois la fonction terminée, elles seront à nouveau supprimées.
Vous pouvez essayer de déclarer vos valeurs en dehors de votre fonction et empêcher le remplacement comme ceci:
if (value1 === undefined) { value1 = val1; } else { // obviously not needed value1 = value1; }
ce que la value1 || val1
dit essentiellement 'hé, si value1
a déjà une valeur, utilisez-la. Sinon, utilisez val1
.
Agit de la même manière que value1 = value1! == undefined? val1: valeur1
ou plus simple:
var value1, value2, value3; function mainFun({ val1, val2, val3 }) { value1 = value1 || val1, value2 = value2 || val2, value3 = value3 || val3; console.log(value1, value2, value3); }
Merci! Et point valide mais essayait d'éviter complètement la var
.
L'implémentation de votre fonction devrait être significativement différente; il faudrait que ces valeurs persistent quelque part. Les paramètres sont en fait des variables locales d'une fonction, ils sont donc nouvellement créés à chaque appel de fonction.
Y a-t-il une question similaire sur la façon de
conserver
ces valeurs? @Pointy