Sauter à un chapitre clé
Comprendre les fermetures en JavaScript
Lorsque l'on plonge dans le monde de Javascript, il est impossible de négliger l'importance des fermetures. La capacité d'une fonction à se souvenir de sa portée et à y accéder même lorsqu'elle s'exécute en dehors de sa portée lexicale est essentiellement ce qui caractérise les fermetures en Javascript.
Définir ce qu'est une fonction de fermeture en JavaScript
Pour en savoir plus sur les fermetures en JavaScript, commençons par définir ce qu'elles sont.
Une fermeture Javascript est une fonction qui a accès à sa propre portée, à la portée de la fonction extérieure et à la portée globale.
- Sa propre portée - les variables définies entre ses curly brackets { }
- La portée de la fonction externe - les variables définies dans la fonction externe.
- La portée globale - les variables définies en tant que variables globales
De plus, une fermeture te permet d'accéder à la portée d'une fonction externe à partir d'une fonction interne. En JavaScript, les fermetures sont créées à chaque fois qu'une fonction est créée, au moment de la création de la fonction.
Portée propre | Variables définies dans la fermeture |
Portée de la fonction externe | Variables de la fonction dans laquelle se trouve la fermeture |
Portée globale | Variables globales |
Prenons un exemple :
function outerFunction() { let outerVariable = 'Je suis de la fonction extérieure' ; function innerFunction() { console.log(outerVariable) ; } return innerFunction ; } let closureFunction = outerFunction() ; closureFunction() ;
Lorsque nous appelons la fonction closureFunction, elle peut toujours accéder à la variable outerVariable à partir de sa portée extérieure, même après le retour de cette fonction.
Analyse des concepts fondamentaux de la fonction de fermeture en JavaScript
Les fermetures sont l'un des concepts clés de JavaScript et l'une des fonctions les plus puissantes. Elles sont en fait une conséquence de la portée lexicale. Pour bien les comprendre, tu dois d'abord connaître la portée lexicale et les fonctions de première classe.
Le terme lexical se rapporte à la phase de compilation de ton code, et c'est là que des choses comme la déclaration des variables sont organisées en une hiérarchie de portées.
La portée lexicale est la capacité d'une portée de fonction à accéder aux variables d'une portée extérieure (contenant).
Et qu'en est-il des fonctions de première classe ? En Javascript, les fonctions peuvent être assignées à des variables, stockées dans un objet ou passées en tant qu'arguments de fonction. C'est ce que nous appelons le langage qui traite les fonctions comme des citoyens de première classe.
Considère ceci - les fermetures sont un lien avec la portée de la fonction extérieure tout au long du cycle de vie de la fonction exécutée et même après la fin de l'exécution de la fonction. La puissance des fermetures devient particulièrement évidente dans la création de la confidentialité des données et des usines de fonctions.
Prenons un autre exemple :
function outerFunction(outerVariable) { return function innerFunction(innerVariable) { console.log('Outer Variable : ' + outerVariable) ; console.log('Inner Variable : ' + innerVariable) ; } } let closureFunction = outerFunction('hello') ; closureFunction('world') ; //logs : Variable externe : hello, Variable interne : world
Dans cet exemple, outerFunction est retournée, mais la portée créée par innerFunction conserve la variable externe. Il s'agit essentiellement d'une fermeture - elle regroupe la fonction et son état environnant, ou environnement lexical, pour former une fermeture.
Approfondir l'exemple de fermeture JavaScript
Expliquer des concepts théoriques est une chose, mais la compréhension des fermetures JavaScript est vraiment illustrée par des exemples. Tu découvriras qu'elles constituent un outil puissant une fois que tu commenceras à les utiliser dans le code réel.
Analyse pratique d'un exemple simple de fermeture en JavaScript
Analysons un exemple simple de fermeture JavaScript pour te donner une approche pratique de la compréhension de ce concept. C'est souvent lorsque nous les voyons en action que la puissance des fermetures brille vraiment.
function makeAdder(x) { return function(y) { return x + y ; } ; } let add5 = makeAdder(5) ; let add10 = makeAdder(10) ; console.log(add5(2)) ; // 7 console.log(add10(2)) ; // 12
Dans cet exemple, makeAdder est une fabrique de fonctions - elle crée des fonctions qui peuvent ajouter une valeur spécifique à leur argument. Dans le cas ci-dessus, la fabrique de fonctions crée deux nouvelles fonctions - l'une qui ajoute 5 à son argument, et l'autre qui ajoute 10.
add5 et add10 sont toutes deux des fermetures. Elles partagent la même définition du corps de la fonction, mais stockent des environnements lexicaux différents. Dans l'environnement lexical de add5, x est 5, tandis que dans le cas de add10, x est 10.
Il est utile de comprendre comment le moteur JavaScript traite le code ci-dessus :
- Le moteur JavaScript définit d'abord la fonction makeAdder et la hisse au sommet.
- Il se déplace ensuite ligne par ligne et voit l'initialisation des fonctions add5 et add10.
- Chaque fois qu'il exécute makeAdder, il produit une fermeture et l'affecte à add5 et add10.
- Enfin, le code de la fonction est exécuté.
C'est ainsi que la théorie est appliquée de manière pratique dans les fermetures JavaScript. L'exemple ci-dessus est assez simple à comprendre mais puissant dans le sens où il introduit le modèle de fabrique, qui est largement utilisé en JavaScript.
Les fermetures permettent aux programmeurs JavaScript d'écrire un code de meilleure qualité, plus succinct et plus expressif. Elles possèdent les propriétés nécessaires à la programmation fonctionnelle et leurs capacités de dissimulation et d'encapsulation des données peuvent également être utilisées pour imiter les concepts de la programmation orientée objet.
Utilisation avancée : Approfondir l'exemple des fermetures JavaScript
Allons plus loin et discutons d'un cas d'utilisation plus avancé des fermetures JavaScript. Plus particulièrement, comment elles peuvent maintenir l'état en l'absence de classes et d'objets. Cet aspect est particulièrement utile pour créer une confidentialité des données et des usines de fonctions.
let counter = (function() { let privateCounter = 0 ; function changeBy(val) { privateCounter += val ; } return { increment : function() { changeBy(1) ; }, decrement : function() { changeBy(-1) ; }, value : function() { return privateCounter ; } ; })() ; console.log(counter.value()) ; // 0 counter.increment() ; counter.increment() ; console.log(counter.value()) ; // 2 counter.decrement() ; console.log(counter.value()) ; // 1
Dans cet exemple de fermeture JavaScript avancée, le compteur est un objet avec des méthodes incrémenter, décrémenter et valeur.
L'environnement lexical de ces fonctions contient deux éléments :
- la variable privateCounter, à laquelle on ne peut pas accéder directement depuis l'extérieur de la fonction anonyme et
- la fonction changeBy.
Ces deux éléments n'existent qu'à l'intérieur de la fonction anonyme. Ils forment un champ d'application privé, ou une fermeture. En raison de leur portée, ils conservent leur état entre les appels de fonction. Ce modèle est largement utilisé en JavaScript pour créer des objets avec des données et des méthodes privées, auxquelles on ne peut pas accéder de l'extérieur.
Ainsi, l'exécution de la fonction increment ajoute la valeur 1 à privateCounter. L'exécution de la fonction value renvoie le montant actuel stocké dans privateCounter. Comme cette variable n'est pas directement accessible en dehors de la fonction anonyme, la fermeture agit comme un objet avec des données privées.
En maîtrisant ces exemples avancés, tu ne te contentes pas d'écrire du JavaScript, tu le parles couramment !
Exploration des cas d'utilisation des fermetures JavaScript
C'est en examinant les fermetures JavaScript en action que leurs véritables prouesses deviennent apparentes. Les cas d'utilisation des fermetures JavaScript sont nombreux et pratiques dans la programmation de tous les jours, depuis les usines de fonctions jusqu'à la confidentialité et l'encapsulation des données.
Révéler les cas d'utilisation des fermetures JavaScript dans la programmation de tous les jours
Les fermetures JavaScript ont quelque chose d'incroyablement fascinant - elles sont presque comme des agents secrets qui détiennent certaines informations privées auxquelles on ne peut accéder que par une fonction d'initié spéciale. L'exploration des cas d'utilisation des fermetures JavaScript, tels que l'émulation de méthodes privées, la création d'usines de fonctions et le retardement de l'exécution des fonctions, met en évidence la puissance de cette fonctionnalité polyvalente.
- Emuler des méthodes privées : Dans de nombreux langages de programmation orientés objet, il est courant d'utiliser des variables et des méthodes privées auxquelles on ne peut pas accéder directement depuis l'extérieur de l'objet. Bien que JavaScript, un langage basé sur les objets, ne s'adapte pas naturellement aux membres privés, nous pouvons utiliser les fermetures pour émuler les méthodes privées et créer une zone de portée privée.
- Créer des usines de fonctions : Les usines de fonctions sont des fonctions qui renvoient d'autres fonctions, ce qui nous permet de créer des modèles de fonctions qui peuvent être personnalisés lorsque nous les invoquons. En utilisant des fonctions qui renvoient d'autres fonctions avec des comportements spécifiques basés sur les arguments que nous passons, nous pouvons créer des fonctions uniques et personnalisées en toute simplicité.
- Retarder l'exécution d'une fonction : Tu peux retarder l'exécution d'une fonction, par exemple dans les setTimeOut, les écouteurs d'événements ou les appels AJAX à l'aide de fermetures.
Un exemple clair d'une fermeture JavaScript à l'œuvre dans la nature se trouve dans les gestionnaires d'événements. Considère l'exemple ci-dessous :
const buttons = document.getElementsByTagName('button') ; for (let i=0 ; i
Dans cet exemple de fermeture JavaScript, le fait de cliquer sur le bouton correspondant enregistre le bon numéro de bouton parce que la fermeture du gestionnaire d'événement click a accès à la variable i de la portée extérieure lorsque le gestionnaire d'événement a été attaché. La valeur de i est conservée et mémorisée même en cas de clic ultérieur.
Comment tirer parti des fermetures JavaScript dans des scénarios réels
Exploiter la puissance des fermetures JavaScript dans des scénarios réels permet d'améliorer l'efficacité et d'apporter plus de robustesse à ton développement. Les cas d'utilisation modulaires, flexibles et concis des fermetures JavaScript peuvent sembler complexes, mais avec un peu de compréhension, ils deviennent des armes substantielles dans l'arsenal d'un développeur.
Maintien de l'état : Dans les applications JavaScript, l'état est souvent maintenu dans des objets et des tableaux. Les fermetures JavaScript te permettent de stocker un état, privé et à l'abri de toute manipulation, qui persiste même après le retour de la fonction extérieure. Ces fermetures peuvent accéder aux données et les manipuler dans leur portée lexicale, c'est-à-dire la portée où elles ont été déclarées. Le fait de renvoyer de manière synchrone et de référencer continuellement cette fonction autonome, ainsi que son état privé caché, permet l'encapsulation et la modularité de ton code.
Encapsulation et confidentialité des données : Les fermetures JavaScript te permettent de créer des données privées. Tout ce qui n'est pas renvoyé par la fonction interne reste privé, ce qui permet d'encapsuler ou d'envelopper les données et les méthodes et d'éviter la pollution de l'espace de noms global et les modifications accidentelles. Nous pouvons exposer uniquement ce qui est nécessaire et garder les autres informations cachées de la portée globale. Cela réduit également la probabilité de conflits de noms de variables.
Éviter le problème des boucles "for" : Les boucles for avec var en JavaScript créent souvent de la confusion et des bogues. Lorsque var est utilisé dans une boucle et que les variables de la boucle ont des rappels asynchrones, le comportement n'est souvent pas celui auquel on s'attendrait. Pour obtenir le comportement approprié, tu dois créer un nouveau champ d'application, ce qui peut être réalisé en utilisant les fermetures JavaScript.
Voici un exemple pertinent de fermeture JavaScript :
for (var i = 1 ; i <= 3 ; i++) { (function(i) { setTimeout(function() { console.log(i) }, 1000) ; })(i) ; }.
Dans le comportement ci-dessus, nous avons immédiatement invoqué une fonction créant une nouvelle portée. Dans cette portée, i a sa propre valeur qui ne changera pas, de sorte que la valeur de i est celle à laquelle nous nous attendons lorsque la fonction est exécutée.
En apprenant à exploiter les fermetures JavaScript dans des scénarios réels, les développeurs peuvent utiliser tout le potentiel de cette puissante fonctionnalité et écrire un code plus propre, plus efficace et plus robuste.
Applications des fermetures JavaScript
Les fermetures JavaScript sont un aspect fondamental du langage et servent de nombreuses applications dans divers domaines de l'informatique. De la gestion de l'état dans les applications JavaScript à la génération de variables et de méthodes privées, les fermetures offrent des fonctionnalités puissantes et aident à écrire un code robuste et efficace.
Diverses applications des fermetures JavaScript en informatique
Que tu construises un simple site Web dynamique ou que tu travailles sur une application Web avancée, la polyvalence des fermetures JavaScript est omniprésente dans le domaine de l'informatique. Leurs applications sont vastes et diverses, allant de la gestion des états et du contrôle de la portée des variables à l'émulation des méthodes privées et à l'encapsulation des données dans leur portée.
L'une des applications courantes des fermetures JavaScript est leur utilisation dans les gestionnaires d'événements et les rappels. Lorsqu'un événement se produit (comme un clic sur un bouton), la fonction est exécutée. Cependant, cette exécution n'a pas lieu dans la portée globale, mais à l'intérieur de la fermeture, qui a accès aux variables de sa fonction parente ainsi qu'à toutes les variables globales.
Les fermetures brillent dans les situations où tu dois garder une trace des informations dans le temps et à travers plusieurs appels de fonction. C'est une façon de "se souvenir" et de continuer à avoir accès aux variables qui étaient dans le champ d'application au moment où la fermeture a été créée. Les fonctions qui "gèrent" ou "gardent la trace" d'ensembles d'opérations connexes sont des cas d'utilisation parfaits pour les fermetures.
Leur autre application peut être vue dans la curation de fonction, une technique pour transformer une fonction avec plusieurs arguments en une série de fonctions qui prennent chacune un seul argument. En voici un exemple :
function multiply(a) { return function executeMultiply(b) { return a * b ; } ; } const double = multiply(2) ; console.log(double(3)) ; // 6 console.log(double(4)) ; // 8
Dans l'exemple ci-dessus, la fonction multiplier crée une fermeture, qui contient une référence - la fonction exécuterMultiplier. Celle-ci est ensuite enregistrée dans une variable double et peut être utilisée plus tard dans le script. C'est ce qu'on appelle le curage de fonction.
Les fermetures te donnent également plus de contrôle lorsque tu travailles avec du JavaScript asynchrone et lorsque tu veux garder la manipulation de la variable près de l'endroit où elle est utilisée.
La portée et l'utilisation étendues des fermetures JavaScript dans la programmation avancée
Les fermetures JavaScript sont largement utilisées dans les scénarios de programmation avancée, en particulier lorsqu'il s'agit de gérer la complexité et d'écrire un code propre, facile à maintenir et efficace.
Dans la conception et la programmation modulaires, les fermetures peuvent jouer un rôle central pour séparer les préoccupations et encapsuler les fonctionnalités du programme dans des modules réutilisables. Ici, tu peux créer des objets avec des méthodes publiques qui ont accès à des variables privées (et à d'autres méthodes privées) par le biais de fermetures.
Prends l'exemple suivant :
let bankAccountModule = (function() { let privateBalance = 0 ; function privateDeposit(amount) { privateBalance += amount ; } return { publicDeposit : function(amount) { privateDeposit(amount) ; }, publicCheckBalance : function() { return privateBalance ; } })() ; bankAccountModule.publicDeposit(500) ; console.log(bankAccountModule.publicCheckBalance()) ; // 500
Dans l'exemple ci-dessus, l'objet bankAccountModule ne peut pas accéder directement à la fonction privateBalance ou privateDeposit. Au lieu de cela, ces fonctions sont gardées privées et protégées de toute modification extérieure. La seule façon d'interagir avec elles est de passer par les méthodes publiques fournies.
Dans la programmation fonctionnelle, les fermetures JavaScript permettent un contrôle plus précis de la portée et offrent la possibilité de conserver une référence durable aux variables, ce qui facilite l'écriture de fonctions pures et permet d'éviter les effets de bord. Elles te donnent également la possibilité d'écrire des fonctions d'ordre supérieur, c'est-à-dire des fonctions qui opèrent sur d'autres fonctions, soit en les prenant comme arguments, soit en les renvoyant, ce qui permet d'obtenir un code plus dynamique et plus flexible.
Les fermetures sont également fondamentales pour l'utilisation correcte des fonctions de rappel, largement utilisées en JavaScript pour la programmation asynchrone. Elles permettent aux fonctions de rappel d'avoir accès aux variables de la fonction qui les contient, ce qui rend la résolution des variables indépendante du moment et de l'endroit où la fonction est appelée et exécutée.
En résumé, la vaste portée et l'utilisation des fermetures JavaScript dans la programmation avancée fournissent un ensemble d'outils puissants pour écrire un code propre, efficace et facile à maintenir dans une grande variété de scénarios.
Maîtriser les fermetures JavaScript
Dans le domaine de la programmation JavaScript, l'un des sujets les plus avancés avec lequel tu peux te débattre est le concept des fermetures. Définies simplement, les fermetures JavaScript sont des fonctions qui ont accès à la portée du parent, même après la fermeture de la fonction parentale. La compréhension de ce concept est un pas décisif vers la maîtrise de JavaScript, en particulier pour la compréhension et l'utilisation de cadres et de bibliothèques complexes.
Avantages et défis de l'utilisation des fermetures JavaScript
En approfondissant les fermetures JavaScript, il est évident qu'elles occupent une niche essentielle dans le paysage de la programmation, grâce à une série d'avantages notables. Cependant, la maîtrise de cet outil exige également de surmonter certains défis.
Du côté des avantages, les principaux sont la confidentialité des données, l'efficacité de la mémoire, ainsi que la modularité et la réutilisation du code.
- Confidentialité des données : JavaScript ne prend pas en charge les propriétés ou méthodes privées au sein d'un objet. Cependant, les fermetures aident les développeurs à imiter ce comportement. Les données enfermées ne sont accessibles qu'à la fonction qui les enferme et à toutes les autres fonctions déclarées dans la même portée, ce qui permet de maintenir l'intégrité et la confidentialité.
- Efficacité de la mémoire : Les fermetures JavaScript ont une façon de "se souvenir" de leur portée lexicale, qui comprend les variables disponibles pour la fonction au moment de sa définition. Cette utilisation efficace de la mémoire est particulièrement bénéfique, par exemple lors de la création d'un grand nombre d'instances d'un objet.
- Modularité et réutilisation du code : Grâce à leur capacité à encapsuler les fonctionnalités et à maintenir un état privé, les fermetures se prêtent naturellement à la production d'un code plus modulaire et réutilisable. Elles permettent par exemple de créer des fonctions d'usine ou des fonctions qui renvoient d'autres fonctions, établissant ainsi une nouvelle couche d'abstraction et de réutilisation.
De plus, les fermetures font partie intégrante de la programmation fonctionnelle en JavaScript, car elles permettent aux fonctions d'avoir de la "mémoire". Elles jouent également un rôle important dans certains modèles de codage JavaScript, notamment le modèle de module et le curry.
Malgré leurs applications inestimables, l'utilisation des fermetures JavaScript n'est pas sans poser de problèmes. Il est souvent difficile de comprendre leur comportement complexe. Voici quelques-unes des difficultés les plus courantes :
- Comprendre la portée et le contexte d'exécution : Étant donné que les fermetures englobent une fonction interne ayant accès aux variables de la fonction externe (englobante), il faut avoir une compréhension globale de la portée des variables et du fonctionnement des contextes d'exécution en JavaScript. Cela inclut la connaissance de l'environnement des variables (portée locale, portée globale), de l'environnement lexical et de la pile d'exécution.
- Consommation de mémoire : Bien que les fermetures soient efficaces en termes de mémoire dans certaines circonstances, elles pourraient entraîner une utilisation excessive de la mémoire si elles ne sont pas gérées correctement. Étant donné qu'une fermeture conserve toutes les variables dans sa portée, elle peut entraîner une utilisation de la mémoire plus importante que nécessaire, rendant le code plus lent à exécuter, en particulier si la fermeture est attachée à une variable ou à un objet global et n'est pas déréférencée après son utilisation.
- Complexité dans la programmation asynchrone : Les fermetures sont également largement utilisées dans le JavaScript asynchrone, où leur compréhension est cruciale puisque la fonction de rappel peut accéder à sa portée parentale, ce qui maintient les variables en vie plus longtemps que ce que l'on pourrait attendre dans un contexte synchrone. La difficulté réside dans la gestion du timing, de la séquence et de la synchronisation des événements.
Il est vrai que certains de ces défis découlent des aspects fondamentaux de JavaScript lui-même, tels que le comportement asynchrone et la portée des variables. Pourtant, une solide compréhension de ces concepts peut effectivement aider à surmonter les défis liés aux fermetures JavaScript.
Améliore tes compétences en programmation avec les fermetures JavaScript
En améliorant tes compétences en programmation grâce à une connaissance approfondie des fermetures JavaScript, tu peux vraiment te démarquer des autres. En plus d'une meilleure compréhension des principes fondamentaux tels que la confidentialité des données et la portée des variables, une appréciation des fermetures JavaScript peut te permettre de gérer des scénarios de script plus avancés en toute confiance.
Les fermetures sont largement utilisées dans les bibliothèques et les cadres JavaScript, tels que React et Angular, où la compréhension des concepts de fermeture est absolument nécessaire. Prenons l'exemple d'un gestionnaire d'événements dans React :
function App() { const [count, setCount] = useState(0) ; const increment = () => { setCount(currentCount => currentCount + 1) ; } ; return ( ) ; }.
Dans l'exemple React ci-dessus, useState renvoie une variable d'état (count) et une fonction pour la mettre à jour (setCount). La fonction passée à setCount utilise une fermeture pour accéder à la valeur actuelle de count lorsque la fonction d'incrémentation s'exécute. Cela montre comment la maîtrise des fermetures t'aide à utiliser et à comprendre pleinement les bibliothèques et frameworks JavaScript populaires.
De plus, les fermetures JavaScript peuvent transformer ton approche du débogage et de la résolution de problèmes, car tu comprends mieux la portée des variables et la pile du contexte d'exécution. Tu peux mieux prédire le comportement de ton code, démêler la cause des bogues plus efficacement et élaborer des solutions concises, efficaces et moins sujettes aux erreurs.
La capacité d'écrire et d'utiliser des fermetures JavaScript est donc une compétence essentielle pour les développeurs JavaScript d'aujourd'hui. Elles sont le résultat naturel de la façon dont JavaScript fonctionne, avec des fonctions de première classe, des champs d'application et des environnements lexicaux. Ainsi, en maîtrisant les fermetures JavaScript, tu approfondis ta compréhension de JavaScript dans son ensemble et tu prépares le terrain pour devenir un développeur compétent.
Clôtures JavaScript - Principaux enseignements
- Les fermetures en JavaScript : Fonctions qui ont accès à la portée du parent, même après la fermeture de la fonction parentale. Elles sont utilisées pour la confidentialité des données et l'encapsulation en JavaScript.
- Fabrique de fonctions : Une fonction comme makeAdder dans le texte qui renvoie deux nouvelles fonctions basées sur des paramètres d'entrée. Les usines de fonctions sont des cas d'utilisation courants pour les fermetures JavaScript.
- Private Scope/Closure : Dans le contexte des fermetures JavaScript, cela signifie que certaines variables ou fonctions n'existent qu'à l'intérieur de la fonction anonyme, formant une fermeture, et ne sont pas accessibles de l'extérieur. Cette technique est courante pour créer une confidentialité des données.
- Retard de l'exécution d'une fonction : On peut retarder l'exécution d'une fonction en utilisant des fermetures. Il peut s'agir d'écouteurs d'événements, de fonctions setTimeOut ou d'appels AJAX.
- Emulation et encapsulation d'objets : Les fermetures JavaScript peuvent être utilisées pour émuler des objets dans le langage, et encapsuler ou envelopper des données et des méthodes pour limiter la pollution de l'espace de noms global et les modifications accidentelles, assurant ainsi la confidentialité des données.
Apprends avec 15 fiches de Closures en Javascript dans l'application gratuite StudySmarter
Tu as déjà un compte ? Connecte-toi
Questions fréquemment posées en Closures en Javascript
À propos de StudySmarter
StudySmarter est une entreprise de technologie éducative mondialement reconnue, offrant une plateforme d'apprentissage holistique conçue pour les étudiants de tous âges et de tous niveaux éducatifs. Notre plateforme fournit un soutien à l'apprentissage pour une large gamme de sujets, y compris les STEM, les sciences sociales et les langues, et aide également les étudiants à réussir divers tests et examens dans le monde entier, tels que le GCSE, le A Level, le SAT, l'ACT, l'Abitur, et plus encore. Nous proposons une bibliothèque étendue de matériels d'apprentissage, y compris des flashcards interactives, des solutions de manuels scolaires complètes et des explications détaillées. La technologie de pointe et les outils que nous fournissons aident les étudiants à créer leurs propres matériels d'apprentissage. Le contenu de StudySmarter est non seulement vérifié par des experts, mais également régulièrement mis à jour pour garantir l'exactitude et la pertinence.
En savoir plus