Je pense que j'ai une très grande émission logique ici. Une valeur de retour de fonction n'est pas reconnue par une autre fonction. Je ne suis pas tout à fait sûr où la valeur renvoyée par Dostuff va ... Pourquoi ne puis-je pas accéder à la valeur numarray?
Je crois comprendre que toutes les valeurs à l'intérieur d'une fonction sont locales à cette fonction ... à moins que j'utilise le retour, ce qui devrait me permettre d'accéder à cette valeur. P>
Donc, ce code est simplement dans une externe JS File ... Ce que vous voyez est la seule chose dedans. Ma grande question est quand je retourne numarray ... où va cette valeur? P>
p>
<form> <input type="button" value="Click Me to generate an array of numbers!" onclick="doStuff()"/> <input type="button" value="Click me to add the array numbers" onclick="addArray()"/> </form>
6 Réponses :
Dans votre fichier JS principal contenant ces fonctions onclick, vous devez avoir une variable globale pour stocker votre numarray après avoir appelé la fonction Dostuff.
quelque chose comme ceci: p>
let globalNumArray // on click button doStuff function (){ globalNumArray = doStuff() } // on click button addArray function() { addArray(globalNumArray) }
Vous devez simplement enregistrer le résultat de Dostuff et Ensuite, accédez à cette variable dans Addarray: p> p> <form>
<input type="button" value="Click Me to generate an array of numbers!" onclick="doStuff()" />
<input type="button" value="Click me to add the array numbers" onclick="addArray()" />
</form>
J'ai toujours lu que je devrais éviter les variables mondiales à tout prix, alors j'essaie de le faire sans utiliser de variables globales.
Vous ne voulez donc pas une variable globale mais vous souhaitez appeler une fonction qui en a besoin? Je ne peux pas envelopper ma tête autour d'elle ... Je veux dire que cela fonctionne et utilise une variable globale, vous devrez décider si vous souhaitez que la fonction fonctionne comme vous aviez l'intention ou du travail de droite, mais sans vos deux boutons sans variable globale
J'ai ajouté une explication sur l'utilisation des variables globales :)
Mon problème ne réalisait pas que je ne pouvais pas utiliser la valeur de retour de Dostuff () de la façon dont je voulais. Je comprends que l'utilisation de la variable globale fonctionnera ... Je n'ai tout simplement pas compris pourquoi tant que toutes ces personnes gentilles ont répondu. Je ne cherchais pas nécessairement de code modifié comme une réponse (reconnaissante pour cela), mais plutôt une réponse sur laquelle NUMARRAY s'affiche indéfini dans mon code incorrect.
Toutes les valeurs à l'intérieur d'une fonction sont locales à cette fonction ... à moins que j'utilise retour p> blockQuote>
Eh bien, c'est ... partiellement vrai. La première partie est vraie et il n'y a pas de "sauf".
Retour CODE> L'instruction est simplement indiquée sur la valeur qui est, bien, renvoyée par une fonction. Cela ne signifie pas que cette variable est maintenant globale. Valeur dans
retour code> est une sorte de "valeur de la fonction" et vous devez l'enregistrer dans une variable si vous souhaitez l'utiliser plus tard, comme vous pouvez le voir dans les réponses des autres. P>
dostuff () strong> retourne une valeur, utilisez donc le retour de cette fonction sous forme de variable. Nous pouvons affecter cette valeur renvoyée à une autre variable ou peut utiliser directement dans l'expression. Alors appelez dostuff () pour obtenir la valeur retournée. p> function doStuff(){
//document.write("We are testing document writing now!");
let numArray;
let sumArray;
let start = parseInt(prompt("Enter a small number"));
let end = parseInt(prompt("Enter a larger number"));
if (start > end){
alert("Error: first int greater than last!")
} else {
let arraySize = end - start;
numArray = [start];
for (let x = start + 1; x <= end; ++x){
numArray.push(x);
}
console.log(numArray);
return numArray;
}
}
console.log('HERE IS ARRAY: '+doStuff());
Appelez la fonction dedaRay de la fonction Dostuff et passez NUMARRAY comme paramètre à celui-ci
function DoStuff() { let numArray; let sumArray; let start = 1; let end = 5; if (start > end){ alert("Error: first int greater than last!") } else { let arraySize = end - start; numArray = [start]; for (let x = start + 1; x <= end; ++x){ numArray.push(x); } } addArray(numArray) } function addArray(numArray){ console.log(numArray); }
Je peux faire ce travail. Je perds simplement la capacité de ne pas y arriver. Ce faisant, cela force cela pour se produire lorsque l'idée originale devait seulement y arriver lorsque j'ai appuyé sur le bouton de la page Web.
J'ai une solution pouvant appeler les deux fonctions séparément .. même si vous n'acceptez pas ma réponse, essayez-la, vous pourriez atteindre votre objectif de cette façon :)
Bulletsbutter Vous pouvez appeler la fonction Dostuff en cliquant sur le bouton
Voici quelques choses que je pense pourrait vous aider:
1) diviser votre code. Dostuff, invite l'utilisateur à entrer, mais il génère également une matrice contenant des valeurs de Min-Max. Vous devriez avoir une fonction séparée qui génère un tableau de min à max. Le fractionnement sera plus facile d'identifier un problème. P>
2) Quelques solutions suggèrent une variable globale qui peut être dangereuse. Lorsque Vous devez partager l'état limiter sa portée à ce qui n'a besoin d'accéder à cet état. p>
3) rendez vos interfaces cohérentes. Vous ne devez pas retourner une autre instance et rien dans un autre. S'il y a une erreur, assurez-vous que vous soyez cohérent avec la manière dont vous avérez l'appelant. P>
p>
function buildArray(start, end) { let arr = []; if (start > end) { // There are a lot ways to deal with this // But you want a consistent interface for letting // the caller no that start < end throw { message: 'Start can\'t be bigger than end', }; } for (let x = start; x <= end; x++) { arr.push(x); } return arr; } // encapsulate the variable numArray, so that it is only accessible // to the methods that need it var numArrayModule = (function(){ let numArray = []; return { doStuff: function(){ let start = parseInt(prompt("Enter a small number")); let end = parseInt(prompt("Enter a larger number")); try { numArray = buildArray(start, end); } catch(err) { console.log(err); } }, addArray: function(){ console.log(numArray); }, } }()); // You may use these as onClick handlers as well. numArrayModule.doStuff(); numArrayModule.addArray();
Où appelez-vous
Addarray code>? Est-ce que les fonctions d'impression
non définies code>? Donyoy utilise jamais le retour de
dostuff code>?
Laissez NANARRAY est une variable locale imbriquée dans une fonction. Si vous appelez Dostuff et retourner numarray, vous devez enregistrer cette variable quelque part. Veuillez ajouter le code où vous appelez à la fois Addarray et Dostuff :)
Il suffit de fixer cela ... pendant que la fonction n'est jamais appelée, pour commencer.
Et
dostuff code> ne renvoie rien explicitement si
Démarrer> Dernier code>.
@Martin, ils sont appelés, " les deux fonctions sont" appelées "par bouton onclick i>" ...
Dostuff et Addarray sont appelés lorsque je clique sur un bouton sur la page Web. Donc .... Form>
@BulletButter Si c'est comme ça que vous appelez
Addarray code>, vous n'en transmettez jamais de données, donc
numarray code> non défini. Je pense que cela est plus un malentendu de la fonctionnalité, des paramètres et des valeurs de retour.
NUMARRAY CODE> IN
Addarray code> n'a pas de valeur simplement parce que vous avez renvoyé une variable avec le même nom dans une autre fonction.
retour code> renvoie la valeur à l'appelant de la fonction. Dans ce cas, il est reçu dans le gestionnaire en ligne, mais il n'est pas utilisé, c'est-à-dire qui n'est attribué à aucune variable, et il est donc jeté.
var NANARRAY = []; code> devrait être défini dans la portée globale - sans le transmettre en tant que paramètre dans la fonction
addarray () code> et sans le redéfinir dans la fonction
dostuff () code> ... car il n'y a pas d'affectation de valeur de retour, elle sera enregistrée, mais la valeur de retour sera supprimée.
J'ai ajouté des lignes, mais le problème n'est vraiment qu'une affectation manquante du résultat, donc pas de biggie;)