2
votes

Arguments dans la fonction JavaScript

J'étudie le fonctionnement des fonctions JavaScript et je me demande quelle est la raison d'être du passage ou non d'arguments lors de la déclaration d'une fonction.

Par exemple dans le Block 1 ci-dessous, je déclare la fonction, sans passer d'argument et cela fonctionne correctement. Je réplique le même exercice dans le Block 2 mais dans ce cas je passe aussi les arguments, et l'alerte me montre "NaN".

Quelle en est la raison?

BLOC 1:

var integer1 = 10;
var integer2 = 20;

function sum (integer1, integer2) {
  sum = (integer1 * integer2);
  return sum; 
}

alert(sum());

BLOC 2:

var integer1 = 10;
var integer2 = 20;

function sum () {
  sum = (integer1 * integer2);
  return sum; 
}

alert(sum());


4 commentaires

La première fonction multiplie les variables externes. Le second attend deux paramètres, mais vous n'en transmettez aucun. Les paramètres de fonction sont appelés de la même manière que les variables externes et par conséquent les ombrent. Mais à cause de sum () les deux ne sont pas définis, et le résultat est donc NaN .


Non. Vous déclarez les paramètres, mais vous ne transmettez aucun argument. Ce devrait être sum (10, 20) .


Il faut également être très prudent en utilisant la variable globale somme à l'intérieur de la fonction car elle écrasera également la fonction du même nom


Oui, les noms que vous avez utilisés ne sont pas idéaux et potentiellement déroutants. Une meilleure façon de déclarer la fonction est quelque chose comme function sum (a, b) {return a + b; } Les noms de paramètres dans la déclaration sont utilisés pour faire référence aux valeurs passées; ils ne devraient pas être les mêmes que les variables existantes.


5 Réponses :


2
votes

En ce qui concerne votre erreur NaN , vous avez essayé d'appeler la fonction réutilisable (la fonction dans le BLOC # 2) sans lui passer d'arguments de sorte qu'elle ne renvoie rien ce qui est évidemment Non un nombre (NaN).


Fonction du bloc n ° 1:

La première fonction n'est pas une fonction réutilisable, ce qui signifie que chaque fois que vous en avez besoin pour calculer de nouvelles valeurs, vous devrez mettre à jour les variables integer1 et integer2 en conséquence comme ceci:

function sum(integer1, integer2) {
  return (integer1 * integer2); 
}

console.log(sum(5, 25));
console.log(sum(8, 32));
console.log(sum(1, 3));
console.log(sum(5, 9));

Fonction du bloc n ° 2:

Cependant, la deuxième fonction est une fonction réutilisable qui peut être invoquée encore et encore avec différents arguments passés à la fonction en tant que paramètres comme celui-ci:

function sum() {
  return (integer1 * integer2); 
}

var integer1 = 5;
var integer2 = 10;
console.log(sum());

var integer1 = 11;
var integer2 = 31;
console.log(sum());


4 commentaires

" somme est un mot-clé réservé en JavaScript " - non, d'où avez-vous obtenu cela?


Si sum a été réservé, vous ne pouvez pas l'utiliser pour le nom de la variable. Vous devriez probablement ajouter une note indiquant que la variable doit également être déclarée correctement. const x ou autre.


@Bergi et Andy Mon erreur. J'ai édité cela. Mes excuses, mes amis.


Devrait mettre en garde contre l'utilisation de variables globales comme x



0
votes

Les arguments sont pratiques, car vous pouvez utiliser la même fonction avec toutes les valeurs dont vous avez besoin. Dans votre BLOC 2, vous avez oublié de passer les arguments lorsque vous avez appelé votre fonction de somme.

alert(sum(integer1, integer2))

Parce que vous n'avez pas passé les arguments lorsque vous avez appelé la fonction, ils étaient indéfinis et essayaient de se multiplier deux variables non définies ont donné un NaN.


0 commentaires

0
votes

La fonction du bloc2 utilise les variables qui s'attendent à être transmises. Dans ce cas, vous n'avez rien passé et donc integer1 et integer2 sont des références nulles / non définies.

Pour le bloc1, vous avez déclaré des variables globales avec des valeurs entières, celles-ci sont ensuite utilisées dans la fonction.


0 commentaires

0
votes

Il semble que cette question porte principalement sur la compréhension du fonctionnement exact des paramètres. Un appel de fonction avec des paramètres attribuera essentiellement des valeurs aux variables locales juste avant que le reste du code de fonction ne soit exécuté.
Pour utiliser votre exemple de code légèrement modifié:

var integer1 = 10;
var integer2 = 20;

La clé pour comprendre comment cela fonctionne est que product (10, 20) attribuera les valeurs transmises à chaque paramètre, dans l'ordre, comme ceci:

function product(integer1, integer2) {
  returnValue = integer1 * integer2;
  return returnValue; 
}

alert(product(10, 20));

Imaginez simplement que la fonction contienne les deux lignes ci-dessus tout en haut.


0 commentaires

1
votes

Pendant que vous écrivez vos fonctions, quelque part vous devez passer quelques valeurs pour exécuter la fonction ou dans un autre cas, votre corps de fonction peut s'exécuter seul. Et ils sont différents programmeur à programmeur bien que la logique derrière la tâche soit la même. Prenons l'exemple ci-dessus, vous avez donné,

ce que nous devons réaliser, une fonctionnalité d'ajout simple.

bloc 1

// define our adding function
function sum (a, b) {  // argument variables may have different variable names
  sum = (a + b);       // which only live within the function **scope**
  return sum;
}

//calling sum
sum(integer1, integer2); // we already declared these two variables integer1 & integer2

// calling sum with direct values
sum(5, 5);  // it returns 10

// now we have two new variables
var num1 = 50;
var num2 = 20;
sum(num1, num2);  // as we expect it returns 70

pour obtenir le résultat dont vous avez besoin pour avoir integer1 & interger2 dans le corps, comme vous l'avez déjà. la logique de votre fonction dépend donc quelque part d'autres éléments. Ce n'est pas une bonne pratique car nous construisons des fonctions pour gérer une logique particulière indépendante du reste du code. Ainsi, dans tout le processus d'exécution, nous pouvons appeler cette fonction et elle fait toujours le même genre de comportement.

bloc 2

var integer1 = 10;
var integer2 = 20;

function sum (integer1, integer2) {
  sum = (integer1 + integer2);
  return sum; 
}

alert(sum(integer1, integer2));

Maintenant, dans ce cas, nous appelons la même fonction mais avec des paramètres. Dans ce scénario, un additionneur a besoin d'au moins 2 valeurs à ajouter. Ainsi, tout moment où nous appelons cette fonction nous donne le résultat de la somme des arguments de passage. Donc cette fonction ne dépend pas de var integer1 & var integer2 , si nous passons d'autres variables à cette fonction, nous pouvons obtenir le même comportement.

Maintenant, nous devons garder à l'esprit lorsque nous appelons une fonction (comme vous le faites dans " alert (sum ()); "), nous devons vérifier si cette fonction nécessite des paramètres, si oui, alors nous devons le passer comme arguments, comme,

var integer1 = 10;
var integer2 = 20;

function sum () {
  sum = (integer1 + integer2);
  return sum; 
}

alert(sum());

pourquoi vous avez NaN

c'est une fonctionnalité de langage, comme vous utilisez Javascript, toute variable non définie contient une valeur undefined , vous pouvez dire que c'est la propriété de Javascript

NaN ne signifie pas un nombre, lorsque nous exécutons l'opération d'addition l'argument les variables de la fonction s'attendent à être des variables de type numérique, mais, par conséquent, nous n'avons passé aucun paramètre lors de l'appel de la fonction sum () , integer1 & integer2 contient la propriété non définie, donc vous avez NaN en conséquence.

comme vous pouvez le voir, je passe deux valeurs entières 5, 5 pour appeler sum , dans un autre cas num1, num2 variables de type entier pour appeler sum . p >

* Si vous regardez de près la dernière ligne, vous voyez, vous avez appelé alert (). C'est une fonction prédéfinie que l'on sort de la boîte du langage de programmation javascript. Mais pour faire alerter ce qu'il fait, nous devons passer une valeur, alors seulement il peut afficher la valeur dans la boîte d'alerte.

donc pendant que vous appelez alert (sum (integer1, integer2)) ; (code corrigé du vôtre) il exécute d'abord sum et en renvoie la valeur, puis appelle alert en utilisant la valeur de retour et le prend comme argument pour s'appeler lui-même. Après cela, nous obtenons la boîte d'alerte avec le résultat de l'ajout.

Merci, j'espère que vous aurez un minimum d'idées claires sur les fonctions. C'est un concept général, pas seulement pour javascript.


0 commentaires