0
votes

JS: Est-il possible de faire partie d'une variable dépendante du paramètre d'une fonction?

Je suis vraiment nouveau à cela et, en tant que telle, ma terminologie est probablement médiocre, demandez-moi de préciser si vous avez besoin. Désolé s'il s'agit d'une question fondamentale. Voici un exemple de mon problème: xxx

mon objectif est de faire la mise à jour de la fonction () avoir un paramètre qui permet au texte d'une zone de texte d'être soit, par exemple, post1title ou post2title.

J'aimerais faire quelque chose de similaire à ce que vous faites avec des chaînes lorsque des variables sont impliquées, comme indiqué ici: xxx

Il ne semble pas Comme vous pouvez faire la même chose lors de l'appel des variables, cependant. J'ai essayé de faire la même chose que vous le feriez avec des chaînes (où "n" est un nombre 1-2): xxx

Ceci lit évidemment en ajoutant trois variables ensemble. Est quelque chose comme ça possible?


5 commentaires

vous voulez combiner des noms de variables comme celle-ci


Pourquoi as-tu besoin de cela ? Vous pouvez avoir toutes les valeurs en tableau ou à votre objet et à passer en conséquence. Il existe des moyens de faire ce que vous essayez de faire 1. Utilisation d'un objet Global / Windows, 2. Deuxièmement, à l'aide d'un objet ordinaire et d'une notation de support 3. Utilisation de Eval. Mais vous devriez éviter d'utiliser 1 et 3. et 2 est toujours correct d'utiliser.


La question est est-elle possible de faire partie d'une variable dépendante du paramètre d'une fonction? , cependant. Seulement 1. et 3. atteindre quelque chose comme ça. Bien sûr, il vaut mieux utiliser un objet, mais ce n'était pas la question


Essayez-vous de définir des paramètres par défaut de l'appels de fonction showtext () ?


Noms de variables dynamiques en JavaScript? Stackoverflow.com/Questtions/5117127/... < / a>


4 Réponses :


0
votes

Vous pouvez utiliser un objet avec Notation faire quelque chose de similaire à cela. De cette façon, votre objet tiendra des clés, qui pointez sur leurs valeurs associées.

Voir exemple ci-dessous: p>

p>

<h2 id="titleBox"></h2>
<p id="bodyBox" ></p>


13 commentaires

Pour le constructeur de fonction +1. ne savait pas que cela peut être fait comme ça aussi


@Codemaniac merci, oui, il est similaire à eval , il a juste moins de frais généraux et pas aussi mauvais: p


De quelle manière est-ce moins mauvais? Quelqu'un pourrait toujours appeler update (", alerte ('0wned'), void _") (toujours à la recherche de bonnes raisons de ne pas utiliser eval )


@pete une raison que eval est plus lent que d'utiliser un constructeur de fonction. Un autre est que eval a la possibilité d'exposer la portée dans laquelle il a été appelé si le code malveillant est utilisé, alors que le constructeur de fonctions ne le fera pas. Jetez un coup d'oeil à Ceci de MDN


Même, il semble que Create-React-APP a été intégré à ESLint pour interdire eval ()


@NickParsons en fait, eval () est plus rapide , au moins au chrome 72. Non une raison de l'utiliser, mais toujours. Qu'entendez-vous par «exposant la portée dans laquelle il a été appelé»?


@Alvintheodora c'est génial. Ce n'est pas une question de réaction cependant. Et je n'essaie pas de promouvoir eval () , c'est juste que c'est la réponse à cette question particulière.


Ajout de l'objet ["Propriété"] Accès également à Mon microbenchmark . C'est plus rapide que les deux, heureusement 😬


@pete hm, intéressant. Je sortais ce que MDN a dit "Eval () est également plus lent que les alternatives, car elles doivent invoquer l'interprète JS, tandis que de nombreuses autres constructions sont optimisées par des moteurs JS modernes." Mais il semble que ce ne soit pas le cas pour le constructeur de la fonction. Ouais, Heureusement, l'accès à la propriété est plus rapide 😀


@NickParsons L'interpréteur JS doit également être impliqué dans le cas d'un constructeur de la fonction. Cela pourrait être que dans ce cas, la chaîne dans le eval est plus courte que dans la fonction () case. On dirait que la vitesse est fortement dépendante de la longueur de la chaîne pour les deux eval et fonction ()


J'ai également fait une microbenchmark à propos de cela aussi, comparaison des performances de fonction () VS () avec des chaînes courtes et longues . On dirait que ce n'est pas la chaîne plus courte qui fait eval () plus rapide


@NickParsons Mon autre idée est que, dans le cas de la fonction (), la fonction résultante doit être appelée, ce qui ajoute des frais généraux. En tout cas, des résultats assez intéressants + surprenants


@pete ah, vous pourriez avoir raison sur la fonction résultante qui devait être appelée. Ouais, assez intéressant en effet, merci à exécuter les tests



0
votes

C'est un anti-motif de dire le moins, mais si vous vraiment strong> veux faire cela (et vous ne le faites pas, mais hélas):

function update(n) {
  setText("titleBox", eval("post" + n + "title"));
  ...


1 commentaires

Au bas de l'électeur: une raison quelconque? Cela répond à la question et souligne également que c'est une mauvaise pratique ...



0
votes

Vous pouvez stocker les valeurs comme propriétés d'un objet uni ou mappe code> et d'utiliser les noms de propriété calculés ou la notation de support pour obtenir la valeur correspondante.

Vous pouvez également ajuster l'ordre des paramètres attendus. p>

p>

const o = {
  post1title: "example title 1",
  post1text: "example text 1",
  post2title: "example title 2",
  post2text: "example text 2"
}

function update(p, t, n) {
  console.log(o[p + n + t])
}

update('post', 'title', 1);


0 commentaires

-1
votes

Il peut être préférable de convertir vos variables en un objet. Cette structure simule le meilleur des données réelles extraites de la base de données par exemple. Et j'utilise littéraux de modèle à l'intérieur du CONSOLE.LOG CODE> Pour combiner la chaîne et les variables de manière plus facile

p>

var posts = {  	
     "title": {
        "1": "example title 1",
       "2": "example title 2",
      },
    
      "text": {
        "1": "example text 1",
        "2": "example text 2",
      }    
}

function update(part, n) {
  /* setText("titleBox", post1title);
  setText("bodyBox", post1text); */
  console.log(`User has set the variable post${n}${part} to: ${posts[part][n]} `); 
}

update('title', '1')
update('title', '2')
update('text', '1')
update('text', '2')


0 commentaires