Maison > Article > interface Web > Comment transférer des fonctions en js
Dans le processus d'apprentissage de js récemment, j'ai rencontré le problème du passage d'objets en tant que paramètres des fonctions js. J'ai également étudié les problèmes de passage de références et de passage de valeurs. Bien que cela ait pris un certain temps, je l'ai finalement compris.
Type de données
Les types de données en JavaScript peuvent être divisés en deux catégories :
Type primitif de valeur de type de base, tel que Indéfini, Null, Booléen, Nombre, Chaîne.
Valeur de type de référence, c'est-à-dire type d'objet Type d'objet, tel que Objet, Tableau, Fonction, Date, etc.
Copie de variables
Comme nous le savons tous, les types de base et les types de référence des variables dans js sont enregistrés de différentes manières, ce qui conduit également à des variables différentes lorsqu'elles sont copiées. Si une valeur de type de base est copiée d'une variable vers une autre variable, la première valeur sera clonée, puis la valeur clonée sera attribuée à la seconde. Par conséquent, les deux valeurs sont complètement indépendantes, mais leurs valeurs le sont. le même.
var num1 = 10;var num2 = num1; console.log(num2);//10
La valeur enregistrée dans num1 ci-dessus est 10. Lorsque la valeur de num1 est attribuée à num2, la valeur de num2 est également 10. Mais ces deux 10 sont complètement indépendants. Le 10 dans num2 est juste cloné, cela équivaut à écrire un document Word et à le mettre dans le dossier num1. Ensuite, je copie le document Word et il s'appelle Word. puis placez cette copie dans le dossier num2. Les deux documents Word sont exactement les mêmes, et la modification de l'un ou l'autre n'affectera pas les deux.
num2 += 1; console.log(num1); //10 console.log(num2); //11
Comme le montre ce qui précède, la valeur de num2 est modifiée, mais la valeur de num1 reste inchangée. Regardons la copie des types référence. Lorsqu'une valeur d'un type référence est copiée d'une variable à une autre, une copie de la valeur stockée dans l'objet variable est également copiée dans l'espace alloué à la nouvelle variable.
var obj1 = { name : "111"};var obj2 = obj1; console.log(obj2.name); //111 obj2.name = "222"; console.log(obj1.name); //222
Le premier résultat imprimé est "111", ce qui est facile à comprendre pour nous, mais le deuxième résultat imprimé est "222", ce qui est un peu déroutant. C'est la différence entre les types de référence et les types de base. Lors de la copie d'un objet, un objet identique ne sera pas créé dans la mémoire tas. Il aura simplement une variable supplémentaire contenant un pointeur vers l'objet. Copiez la valeur de obj1 vers obj2, et la copie de cette valeur est en fait un pointeur. Ce pointeur pointe vers un objet stocké dans le tas, c'est-à-dire qu'une nouvelle adresse mémoire est créée et transmise à obj2, obj1 et obj2. Les variables pointent vers le même objet en même temps. Lorsque l'objet est modifié, leurs valeurs changent, ce qui signifie que les modifications apportées par l'une d'elles seront reflétées dans l'autre. Le schéma simplifié ci-dessous peut être plus clair.
Passer des paramètres de fonction
"JS Advanced Programming" décrit le passage de paramètres comme ceci : Tous les paramètres de fonction sont passés par valeur, c'est-à-dire que les paramètres en dehors de la fonction sont des copies la valeur du paramètre à l'intérieur de la fonction équivaut à copier la valeur d'une variable à une autre. Donc, si vous pouvez comprendre la copie de variables, alors le passage des paramètres sera très simple. Commençons par un exemple de types de base.
var count = 10;function num(num1){ num1 = 1; return num1; }var result = num(count);console.log(result);//1 console.log(count);//10,并未变成1
Cet exemple est facile à comprendre. Il crée en fait une copie de count puis transmet la valeur de count dans le paramètre. Parce que la valeur du paramètre est définie dans la fonction, 1 écrase 10. , le résultat final renvoie 1 et le décompte n'a pas changé. Regardons un exemple de passage d'objets.
var person = { name : "Tom"};function obj(peo){ peo.name = "Jerry"; return peo; }var result = obj(person); console.log(result.name);// Jerry console.log(person.name);// Jerry
Dans l'exemple ci-dessus, person est copié et passé dans obj() et person pointent vers le même objet, et la modification de l'attribut name dans peo modifie en fait l'objet vers lequel ils pointent tous les deux. L'attribut name de l'objet et l'attribut name référencé par la personne externe correspondante changent également, donc ce qui est imprimé est Jerry. En fait, à première vue, il semble que les paramètres de type référence soient transmis par référence. C'est l'erreur que j'ai commise au départ. Regardons un autre exemple.
var person = { name : "Tom"}; function obj(peo){ peo = { name : "Jerry" }; return peo; } var result = obj(person);console.log(result.name);// Jerry console.log(person.name);// Tom
Dans l'exemple ci-dessus, un objet est redéfini dans la fonction, c'est-à-dire qu'il y a maintenant deux objets dans la mémoire tas. La personne externe pointe vers l'ancien objet et est transmise. Le paramètre pointe vers l'objet nouvellement défini, donc la valeur renvoyée après l'appel est la valeur de l'objet nouvellement défini. Si les paramètres sont transmis par référence, alors le résultat imprimé de person.name est Jerry. À partir de ce point, nous pouvons conclure que les paramètres sont transmis par valeur (certains endroits l'appellent transmis par partage).
Nous avons utilisé "Une brève histoire de l'humanité" recommandé par Lao Luo pour la visualiser, mais la description n'est pas très bonne. Le titre du premier chapitre de la brève histoire est « Révolution cognitive ». Nous avons changé son nom en « personne ». Selon le nombre de pages derrière, on retrouve directement le contenu de « Révolution cognitive » « c'est-à-dire l'objet ». pointé par peoson". Deuxièmement Le chapitre est "Agricultural Revolution", nous l'appelons "result", et son sous-répertoire comporte une section "Memory Overload" (renommée "peo"). Vous pouvez également retrouver directement le contenu de cette section en fonction du numéro de page. Maintenant, nous copions "personne" dans "peo", la section "peo" du chapitre 2 devient "personne", et ce que nous trouvons basé sur "peoson" dans le chapitre 1 est toujours celui du contenu du chapitre 1, c'est parce qu'ils pointent à différentes sections de contenu et n’interfèrent pas les uns avec les autres. Ici, la mémoire de tas est le contenu de chaque chapitre, et le contenu du chapitre 1 et du chapitre 2 sont deux objets différents, et les deux ne sont pas liés l'un à l'autre, donc lors de l'impression d'un nom de personne externe, le résultat est toujours l'objet précédent. valeur d'attribut.
Conclusion
En bref, les paramètres en js sont passés par valeur. Les exemples que j'ai écrits sont un peu approximatifs, mais les exemples de "JavaScript Advanced Programming" sont plus clairs et plus faciles à comprendre.
Recommandations associées :
Le principe d'implémentation des paramètres de fonction en js
Les paramètres réels, les paramètres formels et la compréhension de clôture
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!