Comment écrire du code JS de haute qualité_Connaissances de base
Je souhaite écrire une bibliothèque JavaScript efficace mais je ne sais pas par où commencer
J’ai essayé de lire les bibliothèques de classe d’autres personnes, mais il me semblait les comprendre
;Je prévois d'étudier les fonctions avancées de js, mais le contenu du livre faisant autorité est trop dispersé,
Même si je me souviens de "l'usage", je ne pense pas à la "méthode" lorsqu'il s'agit de "l'utiliser".
Peut-être que vous êtes comme moi, il semble y avoir une force invisible qui contraint nos plans, nous faisant penser à plusieurs reprises aux limites de la connaissance, nous obligeant à rester immobiles et à avoir du mal à avancer.
Pendant cette période, la pression a doublé en raison des divers devoirs, conceptions de cours et rapports expérimentaux. Il est rare de prendre un peu de temps, de ne jamais dormir, d'organiser et de résumer les livres que j'ai lus dans le passé, juste pour me rapprocher de l'écriture de ma propre bibliothèque de classe.
Cet article fait référence à "Javascript Language Essence" et "Effective JavaScript". Les exemples ont été débogués, et après les avoir compris, je souhaite simplifier un peu certains principes « profonds ».
1. Portée variable
Scope est comme de l'oxygène pour les programmeurs. Il y en a partout et souvent on n'y pense même pas. Mais lorsqu'il est pollué (par exemple en utilisant des objets globaux), on peut se sentir étouffé (par exemple l'application devient moins réactive). Les règles de portée principales de JavaScript sont simples, bien conçues et puissantes. Utiliser efficacement JavaScript nécessite de maîtriser certains concepts de base de portée variable et de comprendre certains cas extrêmes qui peuvent conduire à des problèmes insaisissables et désagréables.
1.1 Utiliser le moins possible les variables globales
Javascript facilite la création de variables dans l'espace de noms global. La création d'une variable globale se fait sans effort car elle ne nécessite aucune forme de déclaration et est automatiquement accessible par tout le code tout au long du programme.
Pour les débutants comme nous, lorsque nous rencontrons certains besoins (par exemple, les données transmises sont enregistrées, utilisées en attendant qu'une certaine fonction soit appelée à un certain moment ; ou qu'une certaine fonction est fréquemment utilisée), nous ne le faisons pas hésite à penser aux fonctions globales, ou même au langage C que j'ai appris au cours de ma première année, qui est trop profondément enraciné dans la pensée orientée processus, et le système est parfaitement plein de fonctions. La définition de variables globales pollue l'espace de noms public partagé et peut entraîner des conflits de noms inattendus. Les variables globales sont également préjudiciables à la modularité car elles conduisent à un couplage inutile entre les composants indépendants d'un programme. Sérieusement, trop de globaux (y compris des feuilles de style, définissant directement le style de div ou a) deviendront une erreur catastrophique une fois intégrés dans un processus de développement multi-personnes. C'est pourquoi tout le code de jQuery est enveloppé dans une expression anonyme qui s'exécute immédiatement - une fonction anonyme auto-appelante. Lorsque le navigateur charge le fichier jQuery, la fonction anonyme auto-appelante commence immédiatement à s'exécuter et initialise chaque module de jQuery pour éviter d'endommager et de contaminer les variables globales et d'affecter d'autres codes.
(fonction(fenêtre,non défini){
var jQuery = ...
//...
window.jQuery = window.$ = jQuery;
})(fenêtre);
De plus, vous pensez peut-être qu'il est plus pratique « d'écrire comme vous voulez d'abord et de l'organiser plus tard », mais les bons programmeurs prêteront constamment attention à la structure du programme, continueront à classer les fonctions associées et sépareront les composants non pertinents. . et incluez ces comportements dans le cadre du processus de programmation.
Étant donné que l'espace de noms global est le seul moyen d'interagir entre les composants indépendants d'un programme JavaScript, l'utilisation de contrôles nommés globalement est inévitable. Les composants ou bibliothèques doivent définir des variables globales. pour être utilisé par d'autres parties du programme. Sinon, il vaut mieux utiliser des variables locales.
this.foo ;//undéfini
foo = "foo global";
this.foo ;//"global foo"
var foo = "global foo";
this.foo = "changé";
foo ;//changé
L'espace de noms global de JavaScript est également exposé à un objet global accessible dans la portée globale du programme, qui sert de valeur initiale du mot-clé this. Dans les navigateurs Web, les objets globaux sont liés à la variable globale window. Cela signifie que vous avez deux manières de créer une variable globale : la déclarer en utilisant var dans la portée globale ou l'ajouter à l'objet global. L'avantage d'utiliser la déclaration var est qu'elle peut exprimer clairement l'impact des variables globales dans la portée du programme.
Étant donné que les références à des variables globales liées peuvent provoquer des erreurs d'exécution, garder les portées claires et concises permettra aux utilisateurs de votre code de comprendre plus facilement quelles variables globales déclarent le programme.
Étant donné que l'objet global fournit un mécanisme de réponse dynamique pour l'environnement global, vous pouvez l'utiliser pour interroger un environnement en cours d'exécution et détecter quelles fonctionnalités sont disponibles sur cette plate-forme.
eg.ES5 introduit un objet JSON global pour lire et écrire des données au format JSON.
si(!this.JSON){
Ceci.JSON = {
analyser : ..,
stringifier : ... }
>
La conception originale du cours sur la structure des données simulait les opérations de base des chaînes, exigeant que les méthodes fournies par le langage lui-même ne puissent pas être utilisées. JavaScript implémente très bien les opérations de base sur les tableaux. Si c'est juste pour des besoins généraux d'apprentissage, l'idée de simuler les méthodes fournies par le langage lui-même est bonne, mais si vous investissez vraiment dans le développement, ce n'est pas nécessaire. pensez à utiliser les méthodes intégrées de JavaScript en premier lieu.
1.2 Évitez d'utiliser avec
L'instruction with fournit toute "commodité" qui rend votre application peu fiable et inefficace. Nous devons appeler une série de méthodes sur un seul objet en séquence. L'utilisation de l'instruction with peut facilement éviter les références répétées aux objets :
var widget = nouveau widget();
avec(widget){
setBackground("blue");
setForeground("blanc");
setText("Statut : " info);
show();
}
>
avec(Mathématiques){
return min(round(x),sqrt(y));//Référence abstraite
>
>
Au lieu d'utiliser le langage, le moyen le plus simple consiste à lier l'objet à un nom de variable court.
état de la fonction (info){
var w = nouveau Widget();
w.setBackground("bleu");
w.setForeground("blanc");
w.setText("Statut : " info);
w.show();
>
Dans d'autres cas, la meilleure approche consiste à lier explicitement la variable locale à la propriété appropriée.
fonction f(x,y){
var min = Math.min,
tour = Math.tour,
sqrt = Math.sqrt; Retour min(round(x),sqrt(y));
>
1.3 Maîtrise des fermetures
Il existe un seul concept pour comprendre les fermetures :
a) JavaScript vous permet de référencer des variables définies en dehors de la fonction actuelle.
var magicIngredient = "beurre de cacahuète";
fonction make(filling){
return magicIngredient " et " remplissage ;
>
Retour make("gelée");
>
makeSandwich();// "beurre de cacahuète et gelée"
b) Même si la fonction externe est revenue, la fonction actuelle peut toujours référencer les variables définies dans la fonction externe
var magicIngredient = "beurre de cacahuète";
fonction make(filling){
return magicIngredient " et " remplissage ;
>
Retourner la marque ;
>
var f = sandwichMaker();
f("gelée"); // "beurre de cacahuète et gelée"
f("bananes"); // "beurre de cacahuète et bananes"
f("mauves"); // "beurre de cacahuète et mauves"
La fonction make est une fermeture, et son code fait référence à deux variables externes : magicIngredient et fill. Chaque fois que la fonction make est appelée, son code peut référencer ces deux variables car la fermeture stocke ces deux variables.
Une fonction peut référencer n'importe quelle variable dans sa portée, y compris les paramètres et les variables de fonction externes. Nous pouvons en profiter pour écrire une fonction sandwichMaker plus générale.
fonction make(filling){
return magicIngredient " et " remplissage ;
>
Retourner la marque ;
>
var f = sandwichMaker("jambon");
f("fromage"); // "jambon et fromage"
f("moutarde"); // "jambon et moutarde"
Les fermetures sont l’une des fonctionnalités les plus élégantes et expressives de JavaScript et sont au cœur de nombreux idiomes.
c) Les fermetures peuvent mettre à jour la valeur des variables externes. En fait, les fermetures stockent des références à des variables externes, pas des copies de leurs valeurs. Par conséquent, des mises à jour peuvent être effectuées pour toute fermeture ayant accès à ces variables externes.
boîte de fonction(){
var val = indéfini;
Retour {
set : function(newval) {val = newval;},
obtenir : function (){return val;},
tapez : function(){return typeof val;}
};
>
var b = boîte();
b.type(); //non défini
b.set(98.6);
b.get();//98.6
b.type();//numéro
Cet exemple produit un objet contenant trois fermetures. Ces trois fermetures sont des propriétés set, type et get. Elles partagent toutes l'accès à la variable val. La fermeture set met à jour la valeur de val. Appelez ensuite get et tapez pour afficher les résultats mis à jour.
1.4 Comprendre les améliorations de la déclaration des variables
Javascript prend en charge cette méthode de portée (la référence à la variable foo sera liée à la portée la plus proche de la déclaration de la variable foo), mais ne prend pas en charge la portée au niveau du bloc (la portée de la définition de la variable n'est pas la portée englobante la plus proche) ou bloc de code).
Ne pas comprendre cette fonctionnalité entraînera quelques bugs subtils :
la fonction estGagnant(joueur,autres){
var le plus élevé = 0;
pour(var je = 0,n = autres.longueur ;i
Si (player.score > le plus élevé) {
le plus élevé = joueur.score ; }
>
Renvoie player.score > le plus élevé ;
>
1.5 Méfiez-vous de la portée maladroite des expressions de fonctions nommées
var f = fonction(x){ return x*2 }
//....
Retour find(tree.left, key) ||
find(tree.right,key); >
var f= fonction(){
Renvoie le constructeur();
};
f();//{}(dans les environnements ES3)
Ce programme semble générer null, mais il générera en fait un nouvel objet.
Étant donné que la portée de la variable de fonction nommée hérite de Object.prototype.constructor (c'est-à-dire le constructeur de Object), tout comme l'instruction with, cette portée sera affectée par le changement dynamique de Object.prototype. Le moyen d'éviter que les objets ne polluent la portée des expressions de fonction dans votre système est d'éviter d'ajouter des propriétés à Object.prototype à tout moment et d'éviter d'utiliser des variables locales portant le même nom que les propriétés Object.prototype standard.
Une autre lacune des moteurs JavaScript populaires est la promotion des déclarations d'expressions de fonctions nommées.
var f = fonction g(){retour 17;}
g(); //17 (dans un environnement non conforme)
Certains environnements JavaScript traitent même les deux fonctions f et g comme des objets différents, ce qui entraîne une allocation de mémoire inutile.
1.6 Méfiez-vous des déclarations de portée maladroites pour les fonctions de bloc locales
fonction f() {retour "global" ; }
test de fonction(x){
Fonction f(){return "local";}
var résultat = [];
Si(x){
result.push(f());
}
résultat.push(f());
résultat résultat ;
>
test(vrai); //["local","local"]
test(faux); //["local"]
fonction f() {retour "global" ; }
test de fonction(x){
var résultat = [];
Si(x){
fonction f(){return "local";}
result.push(f());
}
résultat.push(f());
résultat résultat ;
>
test(vrai); //["local","local"]
test(faux); //["local"]
Javascript n'a pas de portée au niveau du bloc, donc la portée de la fonction interne f doit être la fonction de test entière. Cela est vrai pour certains environnements JavaScript, mais toutes les implémentations JavaScript ne signalent pas ces fonctions comme des erreurs en mode strict (un programme en mode strict avec une déclaration de fonction de bloc locale le signalera comme une erreur de syntaxe). -code portable et donne une sémantique plus sensible et plus fiable aux déclarations de fonctions de bloc locales pour les futures versions de la norme. Pour cette situation, vous pouvez envisager de déclarer une variable locale dans la fonction de test pointant vers la fonction globale f.

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

Video Face Swap
Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds

Comment utiliser C# pour écrire un algorithme de filtre Bloom Le filtre Bloom (BloomFilter) est une structure de données très économe en espace qui peut être utilisée pour déterminer si un élément appartient à un ensemble. Son idée de base est de mapper des éléments dans un tableau de bits via plusieurs fonctions de hachage indépendantes et de marquer les bits du tableau de bits correspondant comme 1. Pour juger si un élément appartient à un ensemble, il vous suffit de juger si les bits du tableau de bits correspondant sont tous à 1. Si un bit est à 0, on peut juger que l'élément n'est pas dans l'ensemble. Les filtres Bloom proposent des requêtes rapides et

Comment écrire une fonction d'exponentiation en langage C L'exponentiation (exponentiation) est une opération couramment utilisée en mathématiques, qui représente l'opération de multiplication d'un nombre par lui-même plusieurs fois. En langage C, on peut implémenter cette fonction en écrivant une fonction puissance. Ce qui suit présentera en détail comment écrire une fonction de puissance en langage C et donnera des exemples de code spécifiques. Déterminer l'entrée et la sortie de la fonction L'entrée de la fonction puissance contient généralement deux paramètres : la base et l'exposant, et la sortie est le résultat calculé. Par conséquent, nous

Le système de réservation hôtelière est un système de gestion d'informations important qui peut aider les hôtels à parvenir à une gestion plus efficace et à de meilleurs services. Si vous souhaitez apprendre à utiliser C++ pour écrire un système de réservation d'hôtel simple, cet article vous fournira un cadre de base et des étapes de mise en œuvre détaillées. Exigences fonctionnelles d'un système de réservation d'hôtel Avant de développer un système de réservation d'hôtel, nous devons déterminer les exigences fonctionnelles pour sa mise en œuvre. Un système de réservation hôtelière de base doit mettre en œuvre au moins les fonctions suivantes : (1) Gestion des informations sur les chambres : y compris le type de chambre, le numéro de chambre, la

Comment écrire un jeu simple de démineur en C++ ? Minesweeper est un jeu de réflexion classique dans lequel les joueurs doivent révéler tous les blocs selon la disposition connue du champ de mines sans marcher sur les mines. Dans cet article, nous présenterons comment écrire un jeu simple de dragueur de mines en utilisant C++. Tout d’abord, nous devons définir un tableau bidimensionnel pour représenter la carte du jeu Minesweeper. Chaque élément du tableau peut être une structure utilisée pour stocker l'état du bloc, par exemple s'il est révélé, s'il y a des mines, etc. De plus, nous devons également définir

Comment utiliser C# pour écrire un algorithme de programmation dynamique Résumé : La programmation dynamique est un algorithme courant pour résoudre des problèmes d'optimisation et convient à une variété de scénarios. Cet article explique comment utiliser C# pour écrire des algorithmes de programmation dynamique et fournit des exemples de code spécifiques. 1. Qu'est-ce qu'un algorithme de programmation dynamique ? La programmation dynamique (DP) est une idée algorithmique utilisée pour résoudre des problèmes avec des sous-problèmes qui se chevauchent et des propriétés de sous-structure optimales. La programmation dynamique décompose le problème en plusieurs sous-problèmes à résoudre et enregistre la solution à chaque sous-problème.

Comment utiliser C++ pour écrire un système simple de sélection de cours pour les étudiants ? Avec le développement continu de la technologie, la programmation informatique est devenue une compétence essentielle. Dans le processus d'apprentissage de la programmation, un simple système de sélection de cours pour les étudiants peut nous aider à mieux comprendre et appliquer les langages de programmation. Dans cet article, nous présenterons comment utiliser C++ pour écrire un système simple de sélection de cours pour les étudiants. Premièrement, nous devons clarifier les fonctions et les exigences de ce système de sélection de cours. Un système de base de sélection de cours pour étudiants comprend généralement les parties suivantes : gestion des informations sur les étudiants, gestion des informations sur les cours, sélection

Comment écrire l’algorithme KNN en Python ? KNN (K-NearestNeighbours, algorithme K plus proche voisin) est un algorithme de classification simple et couramment utilisé. L’idée est de classer les échantillons de test selon les K voisins les plus proches en mesurant la distance entre les différents échantillons. Cet article expliquera comment écrire et implémenter l'algorithme KNN à l'aide de Python et fournira des exemples de code spécifiques. Tout d’abord, nous devons préparer quelques données. Supposons que nous ayons un ensemble de données bidimensionnelles et que chaque échantillon possède deux caractéristiques. Nous divisons l'ensemble de données en

Comment utiliser C# pour écrire un algorithme de recherche binaire. L'algorithme de recherche binaire est un algorithme de recherche efficace. Il trouve la position d'un élément spécifique dans un tableau ordonné avec une complexité temporelle de O(logN). En C#, nous pouvons écrire un algorithme de recherche binaire en suivant les étapes suivantes. Étape 1 : Préparer les données Tout d’abord, nous devons préparer un tableau trié comme données cibles pour la recherche. Supposons que nous voulions trouver la position d'un élément spécifique dans un tableau. int[]données={1,3,5,7,9,11,13
