Maison interface Web js tutoriel Comment écrire du code JS de haute qualité_Connaissances de base

Comment écrire du code JS de haute qualité_Connaissances de base

May 16, 2016 pm 04:23 PM
code js 编写 高质量

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.

Copier le code Le code est le suivant :

(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.

Copier le code Le code est le suivant :

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.

Copier le code Le code est le suivant :

si(!this.JSON){
Ceci.JSON = {
           analyser : ..,
          stringifier : ...                          }  
>

Si vous fournissez une implémentation JSON, vous pouvez bien entendu utiliser votre propre implémentation de manière simple et inconditionnelle. Mais les implémentations intégrées fournies par l'environnement d'hébergement sont presque plus adaptées car elles sont écrites en C dans le navigateur. Parce qu’ils sont rigoureusement vérifiés pour leur exactitude et leur cohérence par rapport à certaines normes, et qu’ils offrent généralement de meilleures performances que les implémentations tierces.

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 :

Copier le code Le code est le suivant :
état de la fonction (info){
var widget = nouveau widget();
avec(widget){
             setBackground("blue");
             setForeground("blanc");
             setText("Statut : " info);
show();
}  
>

Il est également tentant d'"importer" des variables à partir d'objets de module à l'aide de l'instruction with.

Copier le code Le code est le suivant :
fonction f(x,y){
avec(Mathématiques){
           return min(round(x),sqrt(y));//Référence abstraite
>
>

En fait, JavaScript traite toutes les variables de la même manière. JavaScript recherche des variables en partant de la portée la plus interne et en allant vers l'extérieur. Le langage with traite un objet comme s'il représentait une portée de variable, donc dans un bloc with, la recherche de variable commence par la recherche des propriétés du nom de variable donné. Si la propriété n'est pas trouvée dans cet objet, la recherche se poursuit dans la portée externe. Chaque référence à une variable externe dans un bloc with suppose implicitement qu'il n'y a pas de propriété du même nom dans l'objet with (et dans aucun de ses objets prototypes). La création ou la modification de l'objet with ou de son objet prototype ailleurs dans le programme ne suit pas nécessairement cette hypothèse. Bien entendu, le moteur JavaScript ne lira pas le code local pour savoir quelles variables locales vous utilisez. Les étendues JavaScript peuvent être représentées comme des structures de données internes efficaces, et les recherches de variables peuvent être très rapides. Cependant, comme le bloc de code with doit rechercher la chaîne prototype de l'objet pour trouver toutes les variables du code with, sa vitesse d'exécution est beaucoup plus lente que celle des blocs de code ordinaires.

Au lieu d'utiliser le langage, le moyen le plus simple consiste à lier l'objet à un nom de variable court.

Copier le code Le code est le suivant :

é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.

Copier le code Le code est le suivant :

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.

Copier le code Le code est le suivant :
fonction makeSandwich(){
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

Copier le code Le code est le suivant :
fonction makeSandwich(){
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"

Les valeurs des fonctions javascriptd contiennent plus d'informations que le code requis pour s'exécuter lorsqu'elles sont appelées. De plus, les valeurs des fonctions JavaScript stockent également en interne les variables auxquelles elles peuvent faire référence et qui sont définies dans leur portée englobante. Les fonctions qui assurent le suivi des variables dans le cadre qu'elles couvrent sont appelées fermetures.

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.

Copier le code Le code est le suivant :
fonction makeSandwich(magicIngredient){
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.

Copier le code Le code est le suivant :

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 :

Copier le code Le code est le suivant :

la fonction estGagnant(joueur,autres){
var le plus élevé = 0;
pour(var je = 0,n = autres.longueur ;i            var joueur = autres[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

Copier le code Le code est le suivant :
fonction double(x){ return x*2; }
var f = fonction(x){ return x*2 }

Le même code de fonction peut également être utilisé comme expression, mais il a des significations complètement différentes. La différence officielle entre les fonctions anonymes et les expressions de fonctions nommées est que ces dernières sont liées à une variable portant le même nom de fonction qu'une variable locale de la fonction. Cela peut être utilisé pour écrire des expressions de fonctions récursives.

Copier le code Le code est le suivant :
var f = fonction trouver (arbre, clé){
//....
Retour find(tree.left, key) ||
                    find(tree.right,key);                                                   >


Il convient de noter que la portée de la variable find se situe uniquement dans sa propre fonction. Contrairement aux déclarations de fonction, les expressions de fonction nommées ne peuvent pas être référencées en externe via leurs noms de fonction internes.

find(myTree,"foo");//erreur : find n'est pas défini
var constructeur = function(){ return null; }
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.

Copier le code Le code est le suivant :

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

Copier le code Le code est le suivant :

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"]

Copier le code Le code est le suivant :

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.

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

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 !

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

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

Comment écrire l'algorithme de filtre Bloom en utilisant C# Comment écrire l'algorithme de filtre Bloom en utilisant C# Sep 21, 2023 am 10:24 AM

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

Écrire une méthode pour calculer la fonction puissance en langage C Écrire une méthode pour calculer la fonction puissance en langage C Feb 19, 2024 pm 01:00 PM

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

Comment écrire un système de réservation d'hôtel simple en C++ ? Comment écrire un système de réservation d'hôtel simple en C++ ? Nov 03, 2023 am 11:54 AM

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++ ? Comment écrire un jeu simple de démineur en C++ ? Nov 02, 2023 am 11:24 AM

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 écrire un algorithme de programmation dynamique en utilisant C# Comment écrire un algorithme de programmation dynamique en utilisant C# Sep 20, 2023 pm 04:03 PM

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 ? Comment utiliser C++ pour écrire un système simple de sélection de cours pour les étudiants ? Nov 02, 2023 am 10:54 AM

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 ? Comment écrire l'algorithme KNN en Python ? Sep 19, 2023 pm 01:18 PM

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 écrire un algorithme de recherche binaire en utilisant C# Comment écrire un algorithme de recherche binaire en utilisant C# Sep 19, 2023 pm 12:42 PM

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

See all articles