-1
votes

Besoin d'aide pour comprendre l'endroit où la valeur de retour de la fonction va

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>


10 commentaires

Où appelez-vous Addarray ? Est-ce que les fonctions d'impression non définies ? Donyoy utilise jamais le retour de dostuff ?


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 ne renvoie rien explicitement si Démarrer> Dernier .


@Martin, ils sont appelés, " les deux fonctions sont" appelées "par bouton onclick " ...


Dostuff et Addarray sont appelés lorsque je clique sur un bouton sur la page Web. Donc ....


@BulletButter Si c'est comme ça que vous appelez Addarray , vous n'en transmettez jamais de données, donc numarray non défini. Je pense que cela est plus un malentendu de la fonctionnalité, des paramètres et des valeurs de retour. NUMARRAY IN Addarray n'a pas de valeur simplement parce que vous avez renvoyé une variable avec le même nom dans une autre fonction.


retour 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 = []; devrait être défini dans la portée globale - sans le transmettre en tant que paramètre dans la fonction addarray () et sans le redéfinir dans la fonction dostuff () ... 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;)


6 Réponses :


0
votes

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)
}


0 commentaires

0
votes

edit: strong> La raison pour laquelle les variables globales sont découragées dans JS, car tout code dispose d'un espace de noms global unique, où JavaScript a indiqué automatiquement des variables globales (comme les variables qui ne sont pas explicitement déclarées dans la portée locale sont automatiquement ajoutées à l'espace de noms global). S'appuyer trop de strong> sur des variables globales peut aboutir à certaines collisions entre les scripts sur la même page. Cela ne signifie pas que vous ne devez pas utiliser de variables globales, mais vous ne les utilisez pas de manière légère. Si vous avez besoin d'une variable pour être accessible une fois la fonction terminée, vos choix sont limités, de manière à utiliser une variable globale ou transmettez la variable à la fonction dont vous en avez besoin.

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>


4 commentaires

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.



2
votes

Toutes les valeurs à l'intérieur d'une fonction sont locales à cette fonction ... à moins que j'utilise retour

Eh bien, c'est ... partiellement vrai. La première partie est vraie et il n'y a pas de "sauf". Retour 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 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.


0 commentaires

0
votes

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());


0 commentaires

0
votes

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); 
}


3 commentaires

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



0
votes

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();


0 commentaires