Question

J'ai un problème très étrange avec le javascript. Si vous prenez le code suivant et l'exécuter, il fonctionnera très bien sans aucune erreur, mais si vous commentez le premier alert, il renvoie une erreur à la ligne 5 (var _board = Bomber.BoardFactory.getBoard();) disant BoardFactory n'existe pas encore (rappelez-vous que la première alerte tout était en cours d'exécution sans erreur). Je suis en mesure de reproduire ce comportement exact avec Firefox et Chrome.

Bomber = {};

Bomber.Game = function () {
    var self = {};
    var _board = Bomber.BoardFactory.getBoard();

    self.init = function () {};
    self.start = function () {};

    return self;
}

alert("2");

(function () {
    var instance;

    Bomber.BoardFactory = {};
    Bomber.BoardFactory.getBoard = function () {
        if (!instance)
            instance = new Bomber.Board();
        return instance;
    };
})();

alert("3");

Bomber.Board = function () {
    var self = {};
    return self;
}

$(document).ready(function () {
    var game = Bomber.Game();
    game.init();
    game.start();
});

Ma question, est ce qui peut éventuellement provoquer ce comportement étrange? Comment diable est-il possible qu'un appel d'alerte fait reconnaître le Bomber.BoardFactory?

Était-ce utile?

La solution

Je l'ai couru à travers JSLint, a fixé les erreurs (2 disparus et des points-virgules manquants {} sur votre cas)

Maintenant, il semble fonctionner

Bomber = {};

Bomber.Game = function () {
    var self = {};
    var _board = Bomber.BoardFactory.getBoard();

    self.init = function () {};
    self.start = function () {};

    return self;
};

//alert("2");

(function () {
    var instance;

    Bomber.BoardFactory = {};
    Bomber.BoardFactory.getBoard = function () {
        if (!instance){
            instance = new Bomber.Board();
        }
        return instance;
    };
})();

//alert("3");

Bomber.Board = function () {
    var self = {};
    return self;
};

$(document).ready(function () {
    var game = Bomber.Game();
    game.init();
    game.start();
});

Qu'est-ce qui se passe est que vous manquez le point-virgule final après avoir défini Bomber.Game, donc la chose suivante est (function () .... etc, donc il pense que vous appelez la fonction.

Si vous avez l'alerte là, vous êtes sauvés par insertion automatique virgule.

Autres conseils

il est difficile de prédire que l'on exécutera d'abord: (function () { ou essayer de $(document).ready(function () { de combiner ceux-ci et déclarer toutes vos fonctions avant toute autre chose

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top