JavaScript Gardez le meilleur ! - Douglas Crockford

La page est créée Elisabeth Descamps
 
CONTINUER À LIRE
JavaScript Livre Page I Lundi, 15. décembre 2008 11:34 11

                    JavaScript
                Gardez le meilleur !

                                                      Douglas Crockford
JavaScript Livre Page 1 Lundi, 15. décembre 2008 11:34 11

                                                                                   Préface
                Si nous déplaisons, c’est avec intention....
                De vous persuader... que nous venons, non pour déplaire,
                Mais bien avec intention... de montrer notre simple savoir-faire
                Voilà le vrai commencement de notre fin.
                – William Shakespeare, Le Songe d’une nuit d’été

                Ce livre traite du langage de programmation JavaScript. Il est destiné aux program-
                meurs qui, par hasard ou par curiosité, s’aventurent pour la première fois dans
                l’univers du JavaScript. Il est également destiné aux programmeurs qui ont déjà
                travaillé avec ce langage au niveau débutant et sont maintenant prêts à l’aborder de
                manière plus sophistiquée. Le JavaScript est un langage étonnamment puissant. Son
                originalité soulève un certain nombre de défis, mais par sa taille réduite, il s’avère
                facile à maîtriser.
                Mon but est ici de vous aider à apprendre à penser en JavaScript. Je vais vous présen-
                ter les composants du langage et vous amener à découvrir comment les combiner. Il
                ne s’agit pas d’un livre de référence. Il ne se donne pas pour tâche d’aborder le
                langage et ses excentricités de manière exhaustive. Vous trouverez aisément tout cela
                sur Internet. Ce livre se propose en revanche de n’inclure que ce qui compte vérita-
                blement.
                Cet ouvrage n’est pas destiné aux débutants. J’aurais sans doute plaisir un jour à écrire
                un livre sur les premiers pas en JavaScript, mais ce n’est pas l’objet du présent opus-
                cule. Il ne s’agit pas non plus d’un livre sur Ajax ou sur la programmation web. Son
                objet porte exclusivement sur le JavaScript, qui est l’un des multiples langages que le
                développeur web se doit de maîtriser.
                Ce n’est pas un livre d’introduction. Il n’est pas long, mais il est dense. Il contient un
                grand nombre d’informations. Ne vous découragez pas et n’hésitez pas à le relire
                plusieurs fois. Vos efforts en seront récompensés.
JavaScript Livre Page 2 Lundi, 15. décembre 2008 11:34 11

                2        JavaScript : Gardez le meilleur !

                Conventions utilisées dans ce livre
                Les conventions typographiques suivantes sont utilisées dans ce livre :
                Italique
                     Signale les nouveaux termes, les URL, les noms de fichiers et les extensions de
                     fichiers.
                Chasse fixe
                     Signale le code de manière générale, comme les commandes, les options, les varia-
                     bles, les attributs, les clés, les requêtes, les fonctions, les méthodes, les types, les
                     classes, les modules, les propriétés, les paramètres, les valeurs, les objets, les événe-
                     ments, les gestionnaires d’événements, les balises XML et XHTML, les macros et
                     les mots-clés.
                Chasse fixe en gras
                     Signale les commandes ou le texte qui doit être tapé littéralement par l’utilisateur.

                Utiliser les exemples de code
                Ce livre est là pour vous aider à réaliser votre travail. De manière générale, vous pouvez
                utiliser le code qu’il présente dans vos propres programmes et vos documentations.
                Vous n’avez pas à nous contacter pour en obtenir l’autorisation. Par exemple, l’écriture
                d’un programme qui utilise plusieurs blocs de code du livre ne requiert pas d’autorisa-
                tion. La vente ou la distribution d’un CD-ROM d’exemples requiert en revanche une
                autorisation. Veuillez dans ce cas prendre contact avec l’éditeur d’origine (O’Reilly) en
                mentionnant le titre original JavaScript: The Good Parts (ISBN: 978-0-596-51774-8).
                Le fait de répondre à une question en citant ce livre et en citant du code d’exemple ne
                requiert pas non plus d’autorisation. L’incorporation d’une grande quantité de code
                d’exemple de ce livre dans la documentation de votre produit requiert en revanche une
                autorisation.
                Les références au livre sont appréciées bien qu’elles ne soient pas obligatoires. Elles
                doivent généralement inclure le titre, l’auteur, l’éditeur et le numéro d’ISBN. Par exemple :
                Douglas Crockford, JavaScript : Gardez le meilleur !, Pearson, 2009, 978-2-7440-2328-6.
                Si vous pensez que l’usage que vous faites des exemples de code ne correspond pas aux
                cas évoqués ici, n’hésitez pas à contacter l’éditeur d’origine à permissions@oreilly.com.
JavaScript Livre Page 3 Lundi, 15. décembre 2008 11:34 11

                Préface                                                                                3

                Remerciements
                J’aimerais remercier les relecteurs qui ont signalé mes nombreuses bourdes évidentes.
                Il y a peu de choses que l’on puisse davantage apprécier dans la vie que d’avoir des gens
                intelligents qui vous font remarquer vos erreurs. C’est encore mieux quand ils le font
                avant que cela ne soit rendu public ! Merci donc à Steve Souders, Bill Scott, Julien
                Lecomte, Stoyan Stefanov, Eric Miraglia et Elliotte Rusty Harold.
                J’aimerais remercier les personnes avec lesquelles j’ai travaillé chez Electric Commu-
                nities et State Software et qui m’ont aidé à découvrir qu’au tréfonds du langage se
                cachait du bon, notamment Chip Morningstar, RandyFarmer, John La, Mark Miller,
                Scott Shattuck et Bill Edney.
                J’aimerais remercier Yahoo! Inc. pour m’avoir donné le temps de travailler sur ce projet
                et parce qu’il s’agit d’un excellent domaine de recherche. Merci à tous les membres de
                l’Ajax Strike Force, passés, présents et à venir.
                J’aimerais encore remercier O’Reilly Media, Inc. et notamment Mary Treseler, Simon
                Saint Laurent et Sumita Mukherji qui se sont assurés que tout se déroule sans accroc.
                Un merci tout particulier aussi au professeur Lisa Drake pour tout ce qu’elle fait.
                J’aimerais remercier par ailleurs l’équipe d’ECMA TC39 qui travaille d’arrache-pied
                pour améliorer le langage ECMAScript.
                Enfin, je remercie bien sûr Brendan Eich, le concepteur du langage de programmation
                le plus mal compris du monde, sans qui ce livre n’aurait pas eu sa raison d’être.
JavaScript Livre Page 4 Lundi, 15. décembre 2008 11:34 11
JavaScript Livre Page 5 Lundi, 15. décembre 2008 11:34 11

                                                                                                          1
                                                                 Les bons éléments

                ...sauf l’attrait de mes avantages personnels,
                 je n’ai aucun charme.
                – William Shakespeare, Les Joyeuses Commères de Windsor

                Jeune programmeur, je mettais un point d’honneur à apprendre toutes les fonctionnalités
                des langages dont je me servais et je m’efforçais de les utiliser toutes lorsque je program-
                mais. Peut-être était-ce une manière d’en imposer, et je crois que si je travaillais tant, c’est
                justement parce que c’est à moi que l’on venait immédiatement s’adresser lorsque l’on
                cherchait à savoir comment utiliser une fonctionnalité particulière.
                Je me suis finalement rendu compte que certaines fonctionnalités posaient plus de
                problèmes qu’elles n’en résolvaient. Certaines étaient mal conçues et risquaient plus
                que d’autres de provoquer des complications pour la portabilité. Certaines généraient
                du code trop difficile à lire ou à modifier. Certaines m’amenaient à programmer d’une
                manière trop sophistiquée, avec des risques d’erreurs trop fréquents. Certaines de ces
                fonctionnalités étaient même des erreurs de conception. En effet, certains concepteurs
                de langage font eux-mêmes des erreurs.
                La plupart des langages de programmation contiennent de bons et de mauvais éléments.
                J’ai découvert que je pouvais devenir un meilleur programmeur en n’utilisant que les
                bons et en évitant les mauvais. Quoi de plus logique, car comment créer de bonnes
                choses avec de mauvais ingrédients ?
                Les commissions normatives ont rarement la possibilité de supprimer les imperfections
                d’un langage, car elles conduiraient ainsi à rendre inopérants tous les mauvais programmes
                qui s’appuient sur ces mauvais éléments. Elles n’ont généralement d’autre choix que
                d’empiler de nouvelles fonctionnalités par-dessus les anciennes imperfections existantes.
JavaScript Livre Page 6 Lundi, 15. décembre 2008 11:34 11

                6        JavaScript : Gardez le meilleur !

                Les nouvelles fonctionnalités n’interagissent d’ailleurs pas toujours de manière harmo-
                nieuse, ce qui produit alors de nouveaux mauvais éléments.
                Vous avez cependant vous-même la possibilité de définir votre propre sous-ensemble. Vous
                pouvez écrire de meilleurs programmes en ne vous appuyant que sur les bons
                éléments.
                Le JavaScript est un langage particulièrement bien servi en ce qui concerne les mauvais
                éléments. Il faut dire qu’il est passé de la non-existence à l’adoption universelle à une
                vitesse foudroyante. Pas une seconde pour faire un détour en laboratoire et y être testé
                et affiné. Il est passé directement dans Netscape Navigator 2 en l’état – autrement dit, à
                l’état brut. Lorsque les applets Java ont échoué, le JavaScript est devenu le "langage du
                Web" par défaut. La popularité du JavaScript est presque entièrement indépendante de
                ses qualités de langage de programmation.
                Mais le JavaScript contient heureusement un certain nombre d’éléments exception-
                nellement bons. Il couve en son sein un langage superbe, élégant et très expressif sous
                une pile de bourdes et de bonnes intentions. Ces qualités essentielles du JavaScript
                sont si efficacement cachées qu’on a longtemps pensé du langage qu’il s’apparentait
                à un jouet disgracieux et dépourvu d’intérêt. Ce que je me propose de faire ici, c’est
                de faire apparaître les qualités du JavaScript, cet exceptionnel langage de program-
                mation dynamique. Le JavaScript est comme un bloc de marbre : je me propose de le
                tailler pour en ôter les fonctionnalités hideuses et laisser apparaître sa vraie nature.
                J’estime que l’élégant sous-ensemble que j’ai ainsi isolé est considérablement supé-
                rieur au langage sous sa forme globale, car il est plus fiable, plus lisible et plus facile
                à gérer.
                Je ne tenterai pas dans ce livre de décrire le langage de manière exhaustive. Je me
                concentrerai plutôt sur les bons éléments en fournissant ici et là des avertissements
                concernant les mauvais. Le sous-ensemble que je vais décrire peut être utilisé pour
                construire des programmes fiables et lisibles de petite et de grande taille. En se concen-
                trant sur les bons éléments, il est possible de réduire le temps d’apprentissage,
                d’améliorer la robustesse des programmes et de sauver des arbres en gâchant moins de
                papier.
                L’un des principaux avantages liés au fait d’étudier les bons éléments tient à ce que
                vous éviterez ainsi d’avoir à désapprendre les mauvais. Il est généralement très difficile
                de se défaire de ses mauvaises habitudes. On y rechigne tous au plus haut point. Parfois,
                on décompose les langages en sous-ensembles pour mieux les faire assimiler aux
                étudiants. Dans le cas présent, je propose d’isoler un sous-ensemble du JavaScript afin
                qu’il fonctionne mieux pour les professionnels.
JavaScript Livre Page 7 Lundi, 15. décembre 2008 11:34 11

                Chapitre 1                                                          Les bons éléments     7

                Pourquoi le JavaScript ?
                Le JavaScript est un langage important parce qu’il s’agit du langage des navigateurs
                web. Son association au navigateur en fait l’un des langages de programmation les plus
                populaires du monde. Pourtant, il est aussi l’un des langages les plus méprisés au
                monde. L’API du navigateur, le DOM (Document Object Model ou modèle objet de
                documents), est assez hideuse et le JavaScript est injustement décrié. Le DOM resterait
                ingérable avec n’importe quel langage. Sa spécification est pauvre et il est mal implé-
                menté. Ce livre n’aborde que très superficiellement le DOM. Écrire un livre sur le
                meilleur du DOM, voilà qui représenterait un vrai défi !
                Le JavaScript est particulièrement décrié parce qu’il ne s’apparente à aucun autre
                langage. Si vous êtes aguerri avec un autre langage et que vous deviez programmer
                dans un environnement qui ne prend en charge que le JavaScript, cela peut être
                agaçant. La plupart des gens dans ce cas ne prennent pas même la peine de commen-
                cer par apprendre le JavaScript et découvrent avec surprise qu’il possède d’importan-
                tes différences avec le langage auquel ils aimeraient le voir ressembler et que ces
                différences sont loin d’être négligeables.
                L’incroyable concernant le JavaScript tient à ce qu’il reste souvent possible de réaliser
                les tâches souhaitées sans avoir véritablement à apprendre beaucoup du langage, et
                parfois même sans connaître grand-chose à la programmation.
                Il s’agit d’un langage extrêmement expressif. Il l’est d’autant plus lorsque vous savez ce
                que vous faites. La programmation est une opération difficile. Elle ne doit jamais être
                effectuée avec ignorance.

                Analyse du JavaScript
                Le JavaScript est bâti sur de très bonnes idées et quelques mauvaises. Les très bonnes
                comprennent les fonctions, le couplage lâche, les objets dynamiques et une notation
                littérale expressive des objets. Les mauvaises comprennent notamment un modèle de
                programmation axé sur les variables globales.
                Les fonctions JavaScript sont des objets de première classe avec une portée (le plus
                souvent) lexicale. Le JavaScript est le premier langage lambda à passer au domaine
                grand public. Au fond, le JavaScript a plus à voir avec Lisp et Scheme qu’avec Java.
                C’est une sorte de Lisp revêtu des habits du C. Cela fait du JavaScript un langage
                remarquablement puissant.
                La mode, avec la plupart des langages de programmation d’aujourd’hui, est celle du
                typage fort. La théorie veut que le typage fort permette au compilateur de détecter une
                grande catégorie d’erreurs à la compilation. Plus il est possible de détecter et réparer tôt
JavaScript Livre Page 8 Lundi, 15. décembre 2008 11:34 11

                8        JavaScript : Gardez le meilleur !

                les erreurs, moins elles se révèlent coûteuses. Le JavaScript est un langage faiblement
                typé, si bien que les compilateurs JavaScript ne sont pas capables de détecter les erreurs
                de type. Cette particularité peut inquiéter les programmeurs qui abordent le JavaScript
                après s’être forgé une expérience avec des langages à typage fort. Il se trouve cependant
                que le typage fort ne dispense pas d’avoir à effectuer des tests attentifs. En ce qui me
                concerne, j’ai en outre remarqué dans mon travail que le type d’erreur que la vérifica-
                tion de typage fort effectue ne concerne pas les erreurs qui m’inquiètent véritablement.
                À l’inverse, je trouve le typage faible plutôt libérateur. Il n’oblige pas à créer des
                hiérarchies de classes complexes. Il n’est jamais nécessaire non plus d’avoir à trans-
                typer des valeurs ou à se battre avec le système des types pour parvenir au comportement
                recherché.
                Le JavaScript possède une notation littérale d’objet très puissante. Les objets peuvent
                être créés en listant simplement leurs composants. Cette notation a inspiré JSON
                (JavaScript Object Notation), le format d’échange de données populaire (nous aborderons
                ce sujet à l’Annexe E).
                L’une des fonctionnalités controversées du JavaScript est l’héritage par prototype. Le
                JavaScript possède un système d’objets sans classe dans lequel les objets héritent des
                propriétés directement d’autres objets. Ce mécanisme est très efficace, mais il n’est
                pas habituel pour les programmeurs de formation classique. Si vous tentez d’appliquer
                des design patterns classiques directement au JavaScript, vous risquez d’être frustré.
                En revanche, si vous apprenez à travailler avec le mécanisme de prototypage JavaScript,
                vos efforts seront récompensés.
                Le JavaScript est très décrié pour ses choix conceptuels majeurs. Pour l’essentiel, ces
                choix ont cependant été bons, quoique inhabituels. L’un d’entre eux s’est cependant
                révélé particulièrement mauvais : le JavaScript dépend des variables globales pour la
                liaison. Toutes les variables de niveau supérieur de toutes les unités de compilations
                sont regroupées dans un espace de noms commun appelé objet global. C’est tout à fait
                inopportun, car les variables globales sont une plaie et, en JavaScript, elles sont fonda-
                mentales. Nous verrons heureusement que le JavaScript propose aussi les outils qui
                permettent de minimiser ce problème.
                Dans certains cas, il n’est pas possible d’ignorer les mauvais éléments. Il en existe quel-
                ques-uns d’épouvantables et d’impossibles à éviter, que nous signalerons le moment
                venu. L’Annexe A en dressera également la liste. Nous parviendrons cependant à éviter
                dans ce livre la plupart des mauvais éléments et récapitulerons ce qui a été laissé de côté
                à l’Annexe B. Si vous souhaitez en apprendre plus sur les mauvaises parties et sur la
                manière de mal les utiliser, courez lire un autre livre sur le JavaScript.
JavaScript Livre Page 9 Lundi, 15. décembre 2008 11:34 11

                Chapitre 1                                                          Les bons éléments      9

                Le standard qui définit le JavaScript (aussi connu sous le nom de JScript) est la troisième
                édition du langage de programmation ECMAScript, qui est disponible à l’adresse
                http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf.
                Le langage décrit dans ce livre est un sous-ensemble approprié d’ECMAScript. Ce livre
                ne décrit pas le langage dans son ensemble, car il en exclut les mauvais éléments. Le
                parti pris n’est donc pas celui de l’exhaustivité. Il consiste à éviter les cas limites. Vous
                devriez en faire autant, pour votre sécurité.
                L’Annexe C décrit un outil de programmation appelé JSLint, un parseur JavaScript
                capable d’analyser un programme JavaScript et de signaler les mauvais éléments qu’il
                contient. JSLint fournit un certain niveau de rigueur qui fait généralement défaut dans
                le développement JavaScript. Il peut vous rassurer sur le fait que vos programmes ne
                contiennent que les bons éléments.
                Le JavaScript est un langage contrasté. Il contient quantité d’erreurs et de pièges, si
                bien qu’on peut être tenté de se demander : "Pourquoi l’utiliser ?" Deux réponses
                peuvent être données. La première est que vous n’avez pas le choix. Le Web est devenu
                une importante plate-forme pour le développement d’applications et le JavaScript est le
                seul langage qui se trouve dans tous les navigateurs. Il est bien malheureux que le Java
                ait échoué dans cet environnement ; s’il en avait été autrement, il existerait un choix
                pour ceux qui désirent utiliser un langage classique à typage fort. Mais Java a échoué et
                le JavaScript prospère, si bien qu’on est obligé d’admettre que le JavaScript n’a pas fait
                que des erreurs.
                L’autre réponse est que, en dépit de ses insuffisances, le JavaScript est très bon. Il est
                léger et expressif. Une fois que vous vous y habituerez, vous découvrirez que la
                programmation fonctionnelle peut devenir très amusante.
                Pour bien utiliser ce langage, vous devez cependant être précisément informé sur ses
                limitations. Je les martèlerai avec une certaine brutalité. Ne vous laissez pas décourager
                par cette rigueur. Les bons éléments sont suffisamment bons pour compenser les
                mauvais.

                Une installation simple pour les essais
                Si vous possédez un navigateur web et un éditeur de texte, vous disposez de tous les
                éléments nécessaires pour exécuter des programmes JavaScript. Pour commencer, créez
                un fichier HTML nommé program.html :
                     
                Ensuite, créez un fichier dans le même répertoire nommé program.js :
                     document.writeln(’Hello, world!’);
JavaScript Livre Page 10 Lundi, 15. décembre 2008 11:34 11

                10       JavaScript : Gardez le meilleur !

                Ensuite, ouvrez votre fichier HTML dans votre navigateur pour voir le résultat. Dans ce
                livre, une méthode method est utilisée pour définir les nouvelles méthodes. En voici la
                définition :
                     Function.prototype.method = function (name, func) {
                         this.prototype[name] = func;
                         return this;
                     };
                Elle sera expliquée au Chapitre 4.
Vous pouvez aussi lire