skip to main | skip to sidebar
Code 18
Manuel du savoir-faire à l'usage des geeks et des curieux
RSS
  • Accueil
  • Le web au Québec
  • Liens
  • Twitter
  • Facebook
  • À propos

mercredi 29 décembre 2010

Piège JavaScript avec undefined et les closures

Publié par Infinite Loop, à 11 h 34 1 commentaire

Vous avez fort probablement déjà utilisé la propriété undefined en JavaScript pour vérifier si une variable a été assignée ou pas ? Considérez simplement l'exemple suivant qui déclare ce genre de fonction :

var app = new Object();
var x = '';
var y;

app.isDefined = function(value){
return value !== undefined;
}

console.log( app.isDefined(x) ? 'defined' : 'undefined' );
console.log( app.isDefined(y) ? 'defined' : 'undefined' );
Logiquement, vous vous attendez à ce que la variable x soit définie alors que y ne le soit pas. Si oui, vous avez raison, c'est tout à fait le comportement attendu. Mais qu'arriverait-t-il si on définissait volontairement une variable undefined dans ce script ou involontairement lors de l'inclusion d'une librairie externe ? Le concept de closure viendrait introduire une vulnérabilité :
var app = new Object();
var x = '';
var y;

var undefined = 18; // oups...

app.isDefined = function(value){
return value !== undefined;
}

console.log( app.isDefined(x) ? 'defined' : 'undefined' );
console.log( app.isDefined(y) ? 'defined' : 'undefined' );
Dans ce cas-ci, les deux appels retourneraient 'defined'.

L'idéal serait de ne jamais se fier à la propriété undefined, à moins de la redéclarer à l'intérieur de la fonction qui compte l'utiliser :
var undefined = 18; // ok

app.isDefined = function(value){
// sans danger pour le undefined dans la portée globale
var undefined;
return value !== undefined;
}
Ainsi, on évitera les mauvaises surprises reliées à ce genre de pratique.


Tags: JavaScript

1 réponse à "Piège JavaScript avec undefined et les closures"

  1. Anonyme a dit...
    29 décembre 2010 à 19 h 57

    Je préfère utiliser
    var test
    if (typeof test =='undefined')
    {
    /// pas défini
    }


Publier un commentaire

Message plus récent Messages plus anciens Accueil
S'abonner à : Publier des commentaires (Atom)
    Suivre @code18 sur Twitter

    Catégories

    • Apache (21)
    • Citations (167)
    • Club Vidéo (24)
    • Coffre à outils (56)
    • CSS (8)
    • Curiosités (117)
    • Design Pattern (2)
    • Drupal (8)
    • Easter Eggs (22)
    • Extensions Firefox (20)
    • GIMP (7)
    • Histoire (21)
    • HTML (32)
    • Humour (57)
    • Intégration (34)
    • iPod (12)
    • JavaScript (110)
    • Jeu de combat (6)
    • Le coin du geek (128)
    • Liens (12)
    • Linux (56)
    • Livres (78)
    • Lois et principes (46)
    • Marché des saveurs (26)
    • Mathématique (18)
    • Mobile (5)
    • Montréal (32)
    • Musique (112)
    • Pancartes et écriteaux (16)
    • Perl (8)
    • Pérou (1)
    • PHP (130)
    • PostgreSQL (44)
    • Programmation (105)
    • Saviez-vous que (55)
    • Sécurité (22)
    • SEO (5)
    • SQL Server (22)
    • Vieilles publicités (6)
    • Virtualisation (8)
    • Voyages (1)
    • Zend Framework (26)

    Divers

    Archives

    • ►  2015 (6)
      • ►  août 2015 (1)
      • ►  juillet 2015 (1)
      • ►  février 2015 (3)
      • ►  janvier 2015 (1)
    • ►  2014 (8)
      • ►  décembre 2014 (1)
      • ►  novembre 2014 (1)
      • ►  octobre 2014 (1)
      • ►  août 2014 (2)
      • ►  juillet 2014 (2)
      • ►  janvier 2014 (1)
    • ►  2013 (53)
      • ►  décembre 2013 (2)
      • ►  novembre 2013 (1)
      • ►  octobre 2013 (3)
      • ►  septembre 2013 (2)
      • ►  août 2013 (5)
      • ►  juillet 2013 (3)
      • ►  juin 2013 (5)
      • ►  mai 2013 (3)
      • ►  avril 2013 (7)
      • ►  mars 2013 (7)
      • ►  février 2013 (11)
      • ►  janvier 2013 (4)
    • ►  2012 (105)
      • ►  décembre 2012 (8)
      • ►  novembre 2012 (5)
      • ►  octobre 2012 (4)
      • ►  septembre 2012 (1)
      • ►  août 2012 (8)
      • ►  juillet 2012 (7)
      • ►  juin 2012 (7)
      • ►  mai 2012 (10)
      • ►  avril 2012 (13)
      • ►  mars 2012 (15)
      • ►  février 2012 (15)
      • ►  janvier 2012 (12)
    • ►  2011 (146)
      • ►  décembre 2011 (14)
      • ►  novembre 2011 (11)
      • ►  octobre 2011 (12)
      • ►  septembre 2011 (13)
      • ►  août 2011 (15)
      • ►  juillet 2011 (17)
      • ►  juin 2011 (18)
      • ►  mai 2011 (15)
      • ►  avril 2011 (9)
      • ►  mars 2011 (7)
      • ►  février 2011 (3)
      • ►  janvier 2011 (12)
    • ▼  2010 (398)
      • ▼  décembre 2010 (29)
        • J'ai passé mon cours de programmation avec une not...
        • Piège JavaScript avec undefined et les closures
        • Mauvaise traduction double
        • Connexion VPN avec rdesktop d'Ubuntu à Windows
        • Jouer un wav avec PlaySound et contrôler le volume
        • Citation no. 113 sur le Père Noël
        • Meilleurs voeux pour Noël
        • Illusion d'optique animée
        • Hackers, heroes of the computer revolution
        • Script PHP pour obtenir la liste de tous ses statu...
        • Citation no. 112 sur le bonheur
        • Récupérer le contenu d'un fichier UIF en le conver...
        • Je n'ai jamais vu ce personnage dans Zelda
        • Évaluer des conditions multiples dans une instruct...
        • Redirections HTTP, JavaScript et Refresh
        • Nouvelle balise Datalist en HTML5
        • Machine de Rube Goldberg
        • Excusez-moi, avez-vous l'heure ?
        • Citation no. 111 sur la créativité
        • Épitaphe insultante
        • Flashback en 1981 avec Softporn Adventure
        • Image de webcam en ASCII art sur Linux
        • Comme le fondateur de WikiLeaks, je vire parano
        • Preuve de l'existence des extraterrestres
        • Citation no. 110 sur Internet
        • Démarrer Firefox en mode plein écran par une ligne...
        • Contourner la limitation de la fonction unnest sou...
        • La magie du contexte dans jQuery
        • Trier les éléments du DOM avec TinySort pour jQuery
      • ►  novembre 2010 (28)
      • ►  octobre 2010 (32)
      • ►  septembre 2010 (34)
      • ►  août 2010 (22)
      • ►  juillet 2010 (35)
      • ►  juin 2010 (42)
      • ►  mai 2010 (36)
      • ►  avril 2010 (37)
      • ►  mars 2010 (34)
      • ►  février 2010 (32)
      • ►  janvier 2010 (37)
    • ►  2009 (430)
      • ►  décembre 2009 (32)
      • ►  novembre 2009 (34)
      • ►  octobre 2009 (33)
      • ►  septembre 2009 (37)
      • ►  août 2009 (37)
      • ►  juillet 2009 (39)
      • ►  juin 2009 (38)
      • ►  mai 2009 (37)
      • ►  avril 2009 (35)
      • ►  mars 2009 (37)
      • ►  février 2009 (32)
      • ►  janvier 2009 (39)
    • ►  2008 (84)
      • ►  décembre 2008 (34)
      • ►  novembre 2008 (39)
      • ►  octobre 2008 (11)

    Abonnés

Copyright © All Rights Reserved. Code 18 | Converted into Blogger Templates by Theme Craft