Faut-il utiliser le mot-clé var ou non pour déclarer une variable en Javascript ? Tout dépendra de vos besoins, mais il y a une réelle différence peu documentée.
Je ne vais pas répéter ce qui est expliqué dans tous les manuels, mais ce qui ne l’est pas, et en français, pas en geek 😉
- Toutes les variables déclarées avec var sont clairement stockées dans un espace mémoire réservé à cet usage, et ne peuvent pas être supprimées avec delete. Elles sont de plus limitée à l’usage dans le bloc/fonction dans lequel elles sont déclarées – cf portée des variables Javascript -. ou globale si déclarées à l’extérieur de tout bloc/fonction.
- Toutes les variables non déclarées avec var sont stockées en tant qu’objets de window, et sont donc accessibles soit via leur nom – comme avec var -, soit via window.leurnom, et ceci n’importe où. Elles sont donc dans ce cas implicitement globales, et peuvent être supprimées avec delete
Un exemple de code qui m’en a fait baver – un condensé de la situation qu’on peut trouver évidemment – :
function Envoi(destinaire) { var temp = destinaire; // on peut imaginer ici des traitements quelconques ... AutreFonction(function () { console.log(temp); } }
Si j’appelle la fonction Envoi(‘Toi’), que va-t-il être affiché sur la console ? Toi, évidemment, en tout cas au premier appel ..
Et si j’appelle Envoi(‘Moi’) un peu après ? On va bien sûr penser à Moi …
Et bien non, le résultat sera aléatoire, ce sera Toi ou Moi, selon le traitement que fera AutreFonction(), selon votre navigateur, selon vos traitements spécifiques, bref on ne peut dire ..
La seule parade est de supprimer temp après usage et avant un autre appel à Envoi, donc d’ajouter delete temp après console.log(temp). Mais avec cet exemple, le delete ne servira à rien. Mais en supprimant le mot-clé var, le delete aboutira ! CQFD ..
Bref, un cas d’école qui m’a fait perdre une demi-journée, mais peut-être pas si rare .. 😉