L'établissement des propriétés sur l'objet Window est-il une mauvaise pratique?

J'écris une application JavaScript assez complexe qui possède une architecture MVC que je met en œuvre en utilisant le support de Class Prototype et le modèle de module. L'application utilise AJAX et le modèle Observer. Je crée mon instance de contrôleur lorsque le DOM a été chargé, lui transmet une vue et certains modèles créés à partir de données JSON et loin.

Cependant, j'ai constaté que je devais définir mon instance de contrôleur comme une propriété sur l'objet Window c'est-à-dire le déclarer sans utiliser var car j'ai un rappel AJAX qui actualise l'objet de vue appartenant au contrôleur et à ce point Le code de mon petit MVC petit monde n'a pas sa portée.

J'ai enquêté en passant dans l'objet de vue comme un paramètre à la fonction contenant le code AJAX, mais cela s'est vraiment dérangé et aurait entraîné des violations horribles du modèle MVC, comme le couplage du modèle et de la vue. C'était horrible.

Est-ce que faire des choses comme le stockage de mon instance de contrôleur directement sur Window une mauvaise forme? Il me sent un peu comme l'utilisation d'une variable globale pour moi, mais je ne vois aucun moyen.

Le paramétrage des propriétés sur l'objet fenêtre équivaut à la création de variables globales. C'est-à-dire, parfois, il est inévitable, mais vous devriez essayer de le minimiser, car il finit par polluer l'espace de noms global.

Dans votre cas, créer une propriété unique n'est pas si grave. Si vous voulez être très prudent à ce sujet, vous pouvez créer un espace de noms explicitement pour tout élément dont vous avez besoin d'accès global:

 // In init: var mynamespace = {}; . . . // Once the controller is available: var namespace = window.mynamespace; namespace.controller = controller; namespace.foo = bar; // Set other stuff here as well. 

Je dirais que c'est une mauvaise pratique. Vous pouvez toujours et facilement créer un espace de noms pour votre application et mettre des globals là-bas, si vous devez.

Ils sont utiles lorsque vous souhaitez appeler une fonction globale dont le nom n'est pas connu auparavant.

 var funcName = "updateAns" + ansNum; window[funcName](); 

Ils peuvent être utilisés pour a) éviter les évènements pervers dans la plupart des cas. B) éviter les erreurs de référence aux variables globales.

x = x + 1 générera une erreur de référence si un x global n'est pas défini. window.x = window.x + 1 ne sera pas