Почему комментирование строки alert () этого кода приводит к сбою? - PullRequest
2 голосов
/ 28 января 2011

У меня очень странная проблема с JavaScript.Если вы возьмете следующий код и запустите его, он будет работать без ошибок, но если вы прокомментируете первый alert, он выдаст ошибку в строке 5 (var _board = Bomber.BoardFactory.getBoard();), говоря, что BoardFactory не существует (помните, чтос первым оповещением все работало без ошибок).Я смог воспроизвести это точное поведение с Firefox и 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();
});

Мой вопрос, что может вызвать такое странное поведение?Как это возможно, что тревожный вызов заставляет его распознавать Bomber.BoardFactory?

Ответы [ 2 ]

6 голосов
/ 28 января 2011

Я запустил его через jslint, исправил ошибки (2 пропущенных точки с запятой и пропущенный {} в вашем if)

Теперь, похоже, работает

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();
});

Что происходит, выпропуская последнюю точку с запятой после того, как вы определили Bomber.Game, так что следующая вещь (function () .... и т. д., поэтому она думает, что вы вызываете функцию.

Если у вас есть предупреждение, вы находитесьсохранено автоматической точкой с запятой.

0 голосов
/ 28 января 2011

трудно предсказать, какой из них будет выполнен первым: (function () { или $(document).ready(function () { попытаться объединить их и объявить все ваши функции раньше всего

...